鱼C论坛

 找回密码
 立即注册
查看: 16|回复: 3

[技术交流] Python力扣 两数之和

[复制链接]
发表于 2026-5-10 14:13:22 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 ling830 于 2026-5-10 14:21 编辑

第一个力扣题,通过。
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target  的那 两个 整数,并返回它们的数组下标。

你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。

你可以按任意顺序返回答案。



示例 1:

输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。
示例 2:

输入:nums = [3,2,4], target = 6
输出:[1,2]
示例 3:

输入:nums = [3,3], target = 6
输出:[0,1]


提示:

2 <= nums.length <= 104
-109 <= nums[i] <= 109
-109 <= target <= 109
只会存在一个有效答案

  1. class Solution:
  2.     def twoSum(self, nums: List[int], target: int) -> List[int]:
  3.        from typing import List

  4. class Solution:
  5.     def twoSum(self, nums: List[int], target: int) -> List[int]:
  6.         # 注意:这里必须缩进(通常是4个或8个空格)
  7.         hashmap = {}
  8.         for i, num in enumerate(nums):
  9.             complement = target - num
  10.             if complement in hashmap:
  11.                 return [hashmap[complement], i]
  12.             hashmap[num] = i
  13.         # 函数结束,返回一个空列表作为兜底
  14.         return []

  15. # 这里空一行,下面的 if 必须完全顶格(最左边),不能有空格
  16. if __name__ == '__main__':
  17.     # 实例化
  18.     sol = Solution()
  19.     # 测试数据
  20.     nums = [2, 7, 11, 15]
  21.     target = 9
  22.     # 调用并打印
  23.     result = sol.twoSum(nums, target)
  24.     print(f"最终结果: {result}")
复制代码



进阶:你可以想出一个时间复杂度小于 O(n2) 的算法吗?

  1. from typing import List

  2. class Solution:
  3.     def twoSum(self, nums: List[int], target: int) -> List[int]:
  4.         # 创建账本 (哈希表)
  5.         hashmap = {}
  6.         
  7.         for i, num in enumerate(nums):
  8.             # 算出需要的那个“另一半”
  9.             complement = target - num
  10.             
  11.             # 直接翻账本,看另一半是不是已经在里面了
  12.             if complement in hashmap:
  13.                 # 找到了,返回[旧人下标, 新人下标]
  14.                 return [hashmap[complement], i]
  15.             
  16.             # 没找到,就把自己的值和下标存进账本
  17.             hashmap[num] = i
  18.             
  19.         return []

  20. if __name__ == '__main__':
  21.     sol = Solution()
  22.     # 模拟测试:数据量大时,这个算法的优势极明显
  23.     test_nums = [2, 7, 11, 15]
  24.     test_target = 9
  25.     print(f"&#10024; 质控匹配结果(下标): {sol.twoSum(test_nums, test_target)}")
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2026-5-10 14:13:35 | 显示全部楼层
你的代码有几个关键错误,我来帮你修正。力扣第一题“两数之和”最简单的解法是用哈希表,正确写法如下:


  1. from typing import List

  2. class Solution:
  3.     def twoSum(self, nums: List[int], target: int) -> List[int]:
  4.         hashmap = {}
  5.         for i, num in enumerate(nums):
  6.             complement = target - num
  7.             if complement in hashmap:
  8.                 return [hashmap[complement], i]
  9.             hashmap[num] = i
  10.         return []
复制代码


主要问题:
  • 重复定义了两次 class Solution,只保留一个。
  • 导入 List 应放在文件开头。
  • 哈希表存储错误:应该是 hashmap[num] = i,不是 hashmap = i
  • 返回时应该是 return [hashmap[complement], i](注意补全下标)。
  • 最后兜底返回 return [] 而不是 return


测试部分也要修正:


  1. if __name__ == '__main__':
  2.     sol = Solution()
  3.     nums = [2, 7, 11, 15]
  4.     target = 9
  5.     result = sol.twoSum(nums, target)
  6.     print(f"最终结果: {result}")
复制代码


这个经典题的核心思路是:用字典记录已经遍历过的数字及其下标,对每个新数字,检查目标差值是否在字典里。如果找到,立即返回两个下标。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 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




  1. class Solution:
  2.     def isPalindrome(self, x: int) -> bool:
  3.         # 1. 负数肯定不是回文
  4.         if x < 0:
  5.             return False
  6.         
  7.         # 2. 将数字转为字符串
  8.         s = str(x)
  9.         
  10.         # 3. 对比原字符串和反转后的字符串
  11.         return s == s[::-1]

  12. # --- 下面这部分代码必须“靠边站”(顶格) ---
  13. if __name__ == '__main__':
  14.     sol = Solution()
  15.     test_x = 121
  16.     print(f"数字 {test_x} 是回文吗?{sol.isPalindrome(test_x)}")
复制代码



进阶:你能不将整数转为字符串来解决这个问题吗?

  1. class Solution:
  2.     def isPalindrome(self, x: int) -> bool:
  3.         # 1. 特殊情况排除:
  4.         # 负数不是回文(如 -121)
  5.         # 最后一位是 0 但本身不是 0 的数不是回文(如 10, 100)
  6.         if x < 0 or (x % 10 == 0 and x != 0):
  7.             return False

  8.         reverted_number = 0
  9.         # 2. 核心循环:只翻转数字的一半
  10.         while x > reverted_number:
  11.             # 每次取 x 的最后一位,加到翻转数字的末尾
  12.             reverted_number = reverted_number * 10 + x % 10
  13.             # x 去掉最后一位
  14.             x //= 10

  15.         # 3. 结果判断:
  16.         # 如果是偶数位(如1221),x == reverted_number (12 == 12)
  17.         # 如果是奇数位(如121),x == reverted_number // 10 (1 == 12//10)
  18.         return x == reverted_number or x == reverted_number // 10

  19. # --- 本地测试 ---
  20. if __name__ == '__main__':
  21.     sol = Solution()
  22.     print(f"12321 是回文吗?{sol.isPalindrome(12321)}") # True
  23.     print(f"123 是回文吗?{sol.isPalindrome(123)}")     # False
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2026-5-10 14:18:41 | 显示全部楼层
ling830 发表于 2026-05-10 14:18
给你一个整数 x ,如果 x 是一个回文整数,返回 true  ...


好的,回文数判断有简单高效的方法。这里给出两种常见解法,推荐使用字符串反转的第一种,代码最简洁:


  1. class Solution:
  2.     def isPalindrome(self, x: int) -> bool:
  3.         # 负数直接返回 False(负号破坏了对称性)
  4.         if x < 0:
  5.             return False
  6.         # 将整数转为字符串,反转后比较
  7.         return str(x) == str(x)[::-1]
复制代码


如果面试要求不借助字符串,可用数学方法只反转一半数字:

  1. class Solution:
  2.     def isPalindrome(self, x: int) -> bool:
  3.         # 负数和末位为0的正数(除0本身)不是回文
  4.         if x < 0 or (x % 10 == 0 and x != 0):
  5.             return False
  6.         reverted = 0
  7.         while x > reverted:
  8.             reverted = reverted * 10 + x % 10
  9.             x //= 10
  10.         # 偶数位时 x == reverted;奇数位时去掉中间一位再比较
  11.         return x == reverted or x == reverted // 10
复制代码


核心思路:正负判断 + 利用反转后的字符串与原字符串比较;或反转整数的一半后与另一半比较。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2026-5-25 05:18

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表