2016-09-22 7 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]に変更すると、スワップ/割り当てが機能します。何故ですか?私はSOを見て、Pythonのa,b=b,aスワップは、abの両方をスタックに置いて(=の右側を評価して)、(description here)に再割り当てするように見えます。それがうまくいくならば、なぜ同じ結果を達成しないのですか?b,a=a,b

Leetcodeのオンラインジャッジで、私の現在の(永遠に繰り返す)ページがフリーズします。私は自分のローカルのPython 2.7環境で試してみましたが、それも永遠にループします。私はa,b=b,aが私の環境でb,a=a,bと等価であることをテストしました。それでは、スワップが1つの順序であり、他の順序で完全に動作するとき、なぜ私のコードは永遠にループしますか?

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

を....これはBIGありなしなし!!! –

答えて

1

NUMSの添え字としてNUMS [i]が-1の使用は、あなたが望む順序ではない余分な評価を紹介します。これらのステートメントのうちのいくつかだけで、リスト[1、2、3、4、5、6、7]などの簡単なテストを実行すると、その結果が表示されます。

あなただけの1の中間の操作を処理した場合、私はあなたが欲しいのセマンティクス得るだろうと思う:あなたはそれを反復としてリストを変異されているので

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

ああ、私は 'nums [i]'の値を変更しているので、私はそれをねじ込みます。ありがとう! –

関連する問題