含重复元素的长度为2列表为何在该两数和嵌套for循环代码中失效
LeetCode两数和代码重复值用例失效排查
问题根因
代码bug的核心原因是对Python列表index()方法的特性理解错误:
列表的
index(传入值)方法只会返回列表中第一个与传入值相等的元素下标,和当前遍历到的是哪个位置的元素没有关联。
第三组测试用例执行逻辑问题
针对nums = [3,3], target = 6的测试用例,代码执行全程无法进入结果判断分支:
- 外层循环遍历值x时:无论当前取到的是下标0的3还是下标1的3,调用
nums.index(x)永远返回0——因为列表中第一个值为3的元素固定在下标0位置 - 内层循环遍历值y时:同理,无论当前取到哪个位置的3,调用
nums.index(y)也永远返回0 - 前置判断条件
nums.index(x) != nums.index(y)等价于判断0 != 0,结果永远为假,后续求和、返回结果的逻辑完全不会被触发,两层循环跑完没有命中任何return语句,最终返回空列表。
额外问题说明
这个写法即使能通过前两组无重复值的测试用例,也存在设计缺陷:每次遍历都调用index()反查下标会带来额外的时间开销,只要数组中存在重复值就可能出现下标判断错误,并非只有长度为2的重复值场景会失效。
嵌套循环写法修正参考
直接遍历下标而非遍历元素值,从根源上避免“靠值反查下标”的逻辑漏洞;同时内层循环从外层下标+1的位置开始遍历,天然满足“不重复使用同一个元素”的题目要求,也能减少无效循环:
class Solution: def twoSum(self, nums: List[int], target: int) -> List[int]: arr_length = len(nums) for i in range(arr_length): # 从i的下一位开始匹配,避免选到同一个元素,也不需要重复判断之前的组合 for j in range(i + 1, arr_length): if nums[i] + nums[j] == target: return [i, j]
内容的提问来源于stack exchange,提问作者Peter Lee
相关产品推荐
相关产品推荐

