2016-09-22 95 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]'的值,因为我指定了这个值,这将它拧紧。谢谢! –