对于这个关于leetcode的question,我试图用Python 2.7来解决帖子底部的代码。但是,对于[2,1]
的输入,该函数将永久循环。但是,如果我更改了执行交换的行,并且切换变量以便顺序相反,交换实际上将工作并且该函数正确执行。为什么交换只有一种方式,而不是另一种方式?
所以目前代码的交换为:nums[i], nums[nums[i]-1] = nums[nums[i]-1], nums[i]
,这不起作用(这是在while
循环中)。如果我将交换顺序更改为nums[nums[i]-1], nums[i] = nums[i], nums[nums[i]-1]
,交换/分配确实有效。这是为什么?我看了看,似乎Python的a,b=b,a
交换工作,将a
和b
放在堆栈上(首先评估=
的右侧),然后重新指派它们(description here)。如果这是如何工作的,那么为什么不应该b,a=a,b
达到相同的效果?在我的网上法官,我目前(永远循环)冻结页面。我在我的本地Python 2.7环境中尝试了它,它也永远循环。我在我的环境中测试了a,b=b,a
相当于b,a=a,b
。那么为什么我的代码在下面的循环中永远循环,当交换是一个顺序,并完全按照另一个顺序工作?
def firstMissingPositive(nums):
"""
:type nums: List[int]
:rtype: int
"""
if len(nums) == 1:
if nums[0] != 1:
return 1
else:
return 2
i = 0
while i < len(nums):
if nums[i] > 0 and nums[i] - 1 < len(nums) and nums[i] != nums[nums[i]-1]:
#Line below does not work
nums[i], nums[nums[i]-1] = nums[nums[i]-1], nums[i]
#=>> ??But this works?? # nums[nums[i]-1], nums[i] = nums[i], nums[nums[i]-1]
else:
i += 1
for i, int in enumerate(nums):
if int != i + 1:
return i + 1
return len(nums) + 1
,因为你是变异的列表,你遍历这....这是一个很大的不,不! –