class Solution:
def twoSum(self, nums: list[int], target: int) -> list[int]:
checked = {}
i = 0
while target - nums[i] not in checked:
print(i)
checked[nums[i]] = i
i += 1
return [checked[target - nums[i]], i]
print(Solution().twoSum([3, 2, 4], 6))
我想知道为什么第5行在执行while循环时没有IndexError。
例如,nums = [3,2,4],target = 6,执行完第5、6行后,当i=2时,i在下一个while循环中增长到3,而nums[3]正常情况下会引发IndexError,但实际上并没有,为什么这些代码可以正确地解决问题而不引发Error?
2条答案
按热度按时间xqkwcwgp1#
使用带有调试器的IDE,例如PyCharm Community edition。它是免费的,每个编程人员都需要了解how to debug small programs。
调试器允许你一行一行地调试你的代码,并且它会在每一行之后显示变量的内容。当你这样做的时候,总是把它和你期望的程序做比较。
使用调试器逐行调试代码,您会发现它不会抛出IndexError,因为它不会遇到代码访问无效索引的情况:
1.选中的是
{}
1.进入while循环,因为checked为空
1.选中变为
{3:0}
target-nums[i]
是4,字典中没有1.选中变为
{3:0, 2:1}
target - nums[i]
是6-4是2字典里有1.跳过while循环
1.返回
[checked[2], 2]
,即[1, 2]
调试信息如下所示:
o3imoua42#
while循环在i到达2时终止,因为while中的表达式被求值为false,如下所示。
1.当i = 0且表达式计算为真时,目标- nums[0] -〉6 - 3 -〉3未选中-〉是已选中= {3:0}
1.当i = 1且表达式计算为真时,目标- nums[1] -〉6 - 2 -〉4未选中-〉是已选中= {3:0,2:1}
1.当i = 2,表达式求值为假且循环在此终止时,目标- nums[2] -〉6 - 4 -〉2不在选中状态-〉假
希望它是清晰的