Sum of Pairs问题排查:输入[20,-13,40]求和-7返回异常
问题分析与修复
核心问题
你的代码存在两个关键问题:
- 无匹配时返回值错误:当没有找到符合条件的数对时,你返回了空列表
lst,但题目要求返回None。你提到返回了[20, -13, 40]应该是测试时的误会——实际运行这段代码,输入[20, -13, 40]和目标和-7时,lst是空的,代码会返回[]而非原列表。 - 双重循环效率低下且产生重复项:双层循环会遍历所有
i和j的组合,包括i>j的情况,这会生成重复的数对(比如(20,-13)和(-13,20)都会被加入列表),既浪费性能,也完全没必要。
另外,虽然你通过max(i,j)排序能得到符合要求的结果,但双重循环的方式远不如单次遍历高效。
修复后的代码
用哈希表(字典)优化,只需一次遍历就能找到符合要求的数对,同时保证第二个元素的索引最小:
def sum_pairs(ints, s): seen = {} for idx, num in enumerate(ints): complement = s - num if complement in seen: return [complement, num] seen[num] = idx return None
逻辑说明
- 遍历列表时,用字典
seen记录已经遍历过的数字及其索引 - 对当前数字
num,计算需要的补数complement = s - num - 如果补数已在
seen中,说明之前出现过该数,此时返回[complement, num]——补数的索引更小,这是第一个找到的、第二个元素索引最小的数对 - 遍历结束无匹配时,返回
None
测试验证
输入[20, -13, 40]、目标和-7时:
- 20的补数是-27,不在
seen中,存入20和索引0 - -13的补数是6,不在
seen中,存入-13和索引1 - 40的补数是-47,不在
seen中,存入40和索引2 - 遍历结束,返回
None,完全符合预期。
内容的提问来源于stack exchange,提问作者Aras
相关产品推荐
相关产品推荐

