2016-09-22 115 views
1

對於這個關於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交換工作,將ab放在堆棧上(首先評估=的右側),然後重新指派它們(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 
+0

,因爲你是變異的列表,你遍歷這....這是一個很大的不,不! –

回答

1

採用NUMS [I] -1NUMS標引入了額外的評估,是不是在你想要的順序。運行一個簡單的測試,例如在列表[1,2,3,4,5,6,7]上的幾個這樣的語句,你會看到結果。

如果您處理只有一箇中間操作中,我想你會得到你想要的語義:

index = nums[i] 
nums[i], nums[index-1] = nums[index-1], nums[i] 
+0

嗯好吧 - 我猜是因爲我正在改變'nums [i]'的值,因爲我指定了這個值,這將它擰緊。謝謝! –

相關問題