对于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
不应该达到相同的效果?
在Leetcode的在线评判中,我的当前(永远循环)会冻结页面。我在我的本地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
答案 0 :(得分:1)
使用 nums [i] -1 作为 nums 的下标会引入一个不符合您想要的额外评估。运行一个简单的测试,例如在列表[1,2,3,4,5,6,7]上只有几个这样的语句,你会看到结果。
如果你只处理一个中间操作,我想你会得到你想要的语义:
index = nums[i]
nums[i], nums[index-1] = nums[index-1], nums[i]