Python力扣 两数之和
本帖最后由 ling830 于 2026-5-10 14:21 编辑第一个力扣题,通过。
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。
你可以按任意顺序返回答案。
示例 1:
输入:nums = , target = 9
输出:
解释:因为 nums + nums == 9 ,返回 。
示例 2:
输入:nums = , target = 6
输出:
示例 3:
输入:nums = , target = 6
输出:
提示:
2 <= nums.length <= 104
-109 <= nums <= 109
-109 <= target <= 109
只会存在一个有效答案
class Solution:
def twoSum(self, nums: List, target: int) -> List:
from typing import List
class Solution:
def twoSum(self, nums: List, target: int) -> List:
# 注意:这里必须缩进(通常是4个或8个空格)
hashmap = {}
for i, num in enumerate(nums):
complement = target - num
if complement in hashmap:
return , i]
hashmap = i
# 函数结束,返回一个空列表作为兜底
return []
# 这里空一行,下面的 if 必须完全顶格(最左边),不能有空格
if __name__ == '__main__':
# 实例化
sol = Solution()
# 测试数据
nums =
target = 9
# 调用并打印
result = sol.twoSum(nums, target)
print(f"最终结果: {result}")
进阶:你可以想出一个时间复杂度小于 O(n2) 的算法吗?
from typing import List
class Solution:
def twoSum(self, nums: List, target: int) -> List:
# 创建账本 (哈希表)
hashmap = {}
for i, num in enumerate(nums):
# 算出需要的那个“另一半”
complement = target - num
# 直接翻账本,看另一半是不是已经在里面了
if complement in hashmap:
# 找到了,返回[旧人下标, 新人下标]
return , i]
# 没找到,就把自己的值和下标存进账本
hashmap = i
return []
if __name__ == '__main__':
sol = Solution()
# 模拟测试:数据量大时,这个算法的优势极明显
test_nums =
test_target = 9
print(f"✨ 质控匹配结果(下标): {sol.twoSum(test_nums, test_target)}") 你的代码有几个关键错误,我来帮你修正。力扣第一题“两数之和”最简单的解法是用哈希表,正确写法如下:
from typing import List
class Solution:
def twoSum(self, nums: List, target: int) -> List:
hashmap = {}
for i, num in enumerate(nums):
complement = target - num
if complement in hashmap:
return , i]
hashmap = i
return []
主要问题:
[*]重复定义了两次 class Solution,只保留一个。
[*]导入 List 应放在文件开头。
[*]哈希表存储错误:应该是 hashmap = i,不是 hashmap = i。
[*]返回时应该是 return , i](注意补全下标)。
[*]最后兜底返回 return [] 而不是 return 。
测试部分也要修正:
if __name__ == '__main__':
sol = Solution()
nums =
target = 9
result = sol.twoSum(nums, target)
print(f"最终结果: {result}")
这个经典题的核心思路是:用字典记录已经遍历过的数字及其下标,对每个新数字,检查目标差值是否在字典里。如果找到,立即返回两个下标。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。
回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
例如,121 是回文,而 123 不是。
示例 1:
输入:x = 121
输出:true
示例 2:
输入:x = -121
输出:false
解释:从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。
示例 3:
输入:x = 10
输出:false
解释:从右向左读, 为 01 。因此它不是一个回文数。
提示:
-231 <= x <= 231 - 1
class Solution:
def isPalindrome(self, x: int) -> bool:
# 1. 负数肯定不是回文
if x < 0:
return False
# 2. 将数字转为字符串
s = str(x)
# 3. 对比原字符串和反转后的字符串
return s == s[::-1]
# --- 下面这部分代码必须“靠边站”(顶格) ---
if __name__ == '__main__':
sol = Solution()
test_x = 121
print(f"数字 {test_x} 是回文吗?{sol.isPalindrome(test_x)}")
进阶:你能不将整数转为字符串来解决这个问题吗?
class Solution:
def isPalindrome(self, x: int) -> bool:
# 1. 特殊情况排除:
# 负数不是回文(如 -121)
# 最后一位是 0 但本身不是 0 的数不是回文(如 10, 100)
if x < 0 or (x % 10 == 0 and x != 0):
return False
reverted_number = 0
# 2. 核心循环:只翻转数字的一半
while x > reverted_number:
# 每次取 x 的最后一位,加到翻转数字的末尾
reverted_number = reverted_number * 10 + x % 10
# x 去掉最后一位
x //= 10
# 3. 结果判断:
# 如果是偶数位(如1221),x == reverted_number (12 == 12)
# 如果是奇数位(如121),x == reverted_number // 10 (1 == 12//10)
return x == reverted_number or x == reverted_number // 10
# --- 本地测试 ---
if __name__ == '__main__':
sol = Solution()
print(f"12321 是回文吗?{sol.isPalindrome(12321)}") # True
print(f"123 是回文吗?{sol.isPalindrome(123)}") # False ling830 发表于 2026-05-10 14:18
给你一个整数 x ,如果 x 是一个回文整数,返回 true...
好的,回文数判断有简单高效的方法。这里给出两种常见解法,推荐使用字符串反转的第一种,代码最简洁:
class Solution:
def isPalindrome(self, x: int) -> bool:
# 负数直接返回 False(负号破坏了对称性)
if x < 0:
return False
# 将整数转为字符串,反转后比较
return str(x) == str(x)[::-1]
如果面试要求不借助字符串,可用数学方法只反转一半数字:
class Solution:
def isPalindrome(self, x: int) -> bool:
# 负数和末位为0的正数(除0本身)不是回文
if x < 0 or (x % 10 == 0 and x != 0):
return False
reverted = 0
while x > reverted:
reverted = reverted * 10 + x % 10
x //= 10
# 偶数位时 x == reverted;奇数位时去掉中间一位再比较
return x == reverted or x == reverted // 10
核心思路:正负判断 + 利用反转后的字符串与原字符串比较;或反转整数的一半后与另一半比较。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页:
[1]