ling830 发表于 2026-5-10 14:13:22

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)}")

FishC 发表于 2026-5-10 14:13:35

你的代码有几个关键错误,我来帮你修正。力扣第一题“两数之和”最简单的解法是用哈希表,正确写法如下:


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 小助理,如未能正确解答您的问题,请继续追问。

ling830 发表于 2026-5-10 14:18:28

给你一个整数 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

FishC 发表于 2026-5-10 14:18:41

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]
查看完整版本: Python力扣 两数之和