两段仅一行差异的twoSum代码结果不同,求解析差异原因(编程新手)
两段twoSum代码的差异解析
我写了两段twoSum的代码,看似只差一行(一段用了else,一段没有),但运行结果完全不同。作为编程新手,想搞清楚两者的差异到底在哪。
第一段代码(正确逻辑)
class Solution: def twoSum(self, nums: List[int], target: int) -> List[int]: numMap = {} n = len(nums) # Build the hash table for i in range(n): numMap[nums[i]] = i # Find the complement for i in range(n): complement = target - nums[i] if complement in numMap and numMap[complement] != i: return [i, numMap[complement]] return [] # No solution found
第二段代码(存在两处关键错误)
class Solution: def twoSum(self, nums: List[int], target: int) -> List[int]: numMap = {} n = len(nums) for i in range(n): numMap[nums[i]] = i for i in range (n): complement = target - nums[i] if complement in numMap and numMap[complement] != i: return[i,numMap[complement]] else: return []
核心差异解析
缩进错误(最致命的语法问题)
第二段代码里,用来构建哈希表的for i in range(n):循环没有缩进在twoSum函数内部,导致这段代码根本不会在调用twoSum时执行。函数里的numMap始终是空字典,后续查找补数的逻辑从一开始就失效。else语句的逻辑错误
就算把缩进问题修复,第二段代码里的else和if绑定,意味着只要第一个元素的补数不满足条件,就会直接返回空列表,完全不会遍历后面的元素。而第一段代码是遍历完所有元素都没找到符合条件的数对,才会返回空列表。
举个例子:如果输入nums=[3,2,4], target=6,正确解是[1,2]。第二段代码会先检查第一个元素3,它的补数是3,虽然在哈希表里,但索引相同(都是0),不满足条件,这时直接触发else返回空,完全不会去检查后面的2和4。而第一段代码会继续遍历到i=1(元素2),找到补数4的索引是2,满足条件后返回正确结果。
内容的提问来源于stack exchange,提问作者Yuvraj Chadha
相关产品推荐
相关产品推荐

