對於這個關於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
,因爲你是變異的列表,你遍歷這....這是一個很大的不,不! –