为什么交换工作是单向的而不是另一种方式?

时间:2016-09-22 00:06:02

标签: python python-2.7

对于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不应该达到相同的效果?

在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

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]