调试器显示j小于i?Python两数之和代码问题求助
两数之和代码问题解析:为什么j没有从i+1开始?
核心问题根源
你的代码里有两个关键逻辑错误,直接导致了j的取值不符合预期:
- 第一个循环遍历的是
nums的元素值,而非数组索引,这让你后续用i控制j的范围完全偏离了目标 - 第二个循环的
range(i+1)里的i是元素值(比如当元素是1时,range(2)会生成0、1),所以j自然会取到0,和你想要的「j从i的下一个索引开始」完全不是一回事
详细错误拆解
- 遍历对象错误:你需要的是遍历数组的索引,这样才能精准控制j从当前索引的下一个位置开始,避免重复检查同一对元素。但你现在写的
for i in nums是把数组里的数值(1、2、3...)赋值给i,这和索引没有任何关系。 - 循环范围错误:当i是元素值1时,
range(i+1)等价于range(2),会生成0和1两个整数,所以j会取到0,这完全不符合你「j从i+1开始」的预期——因为你混淆了元素值和索引的概念。 - 判断逻辑错误:
if i == (target - j)里的j是循环生成的整数,不是nums中的元素,这导致你的判断逻辑完全错误,正确的逻辑应该是检查两个不同位置的元素相加等于目标值。
修正后的代码
def main(): target = int(input(" Target Number: ")) nums = [1, 2, 3, 4, 5, 6, 7, 8, 9] print(two_sum(target, nums)) def two_sum(target, nums): # 遍历数组的索引,而非元素值 for i_idx in range(len(nums)): # j从i的下一个索引开始,避免重复检查 for j_idx in range(i_idx + 1, len(nums)): if nums[i_idx] + nums[j_idx] == target: # 返回元素值,和你原代码的返回逻辑一致;如果需要返回索引,就返回i_idx, j_idx return nums[i_idx], nums[j_idx] # 题目保证有解,这里可以加个默认返回 return None if __name__ == "__main__": main()
验证示例
比如输入target=3时,i_idx=0(对应元素1),j_idx从1开始,nums[0]+nums[1]=1+2=3,直接返回(1,2),符合预期;不会出现j取0的情况。
内容的提问来源于stack exchange,提问作者Ben
相关产品推荐
相关产品推荐

