无法理解Python中交换语句的这种行为

问题描述 投票:0回答:1

我正在解决leetcode上的一道题。 “41.第一个缺失的阳性”

对于交换,当我使用 nums[i],nums[nums[i]-1] = nums[nums[i]-1],nums[i] 时,我得到了 TLE。

但是 nums[nums[i]-1],nums[i] = nums[i],nums[nums[i]-1] 工作正常。

这不仅仅是leetcode的情况。

我试图理解其中的区别,花了 1 个小时来解决这个问题。 然后联系了 Google bard 和 Chatgpt。两人都在挣扎。

花了很多时间后,我得到了一个答案“鉴于这两个代码共享相同的逻辑和条件语句,为什么代码 1 会出现问题仍然令人费解,尤其是在您描述的无限循环场景中。”

这是我的代码:

class Solution:
    def firstMissingPositive(self, nums: List[int]) -> int:
        i,n = 0,len(nums)

        while i<n:
            if nums[i]>0 and nums[i]<=n and nums[nums[i]-1]!=nums[i]:
                #nums[i],nums[nums[i]-1] = nums[nums[i]-1],nums[i]
                nums[nums[i]-1],nums[i] = nums[i],nums[nums[i]-1]

            else:
                i+=1
        for i in range(n):
            if nums[i]!=i+1:
                return i+1
        return n+1
        

注释掉的语句给出了 TLE ,但第二个语句工作正常。有人可以解释一下,是什么原因造成的? a,b=b,a 和 b,a=a,b 不同吗?

我也在Python IDLE中定义了该函数,在交换语句下面添加了一条打印语句,结果又陷入了无限循环。

Defined function in Python IDLE

Output (infinite loop)

TLE with first statement

Accepted with second statement

python arrays python-3.x algorithm logic
1个回答
0
投票

是的,分配发生的顺序发生了变化。

第一种情况,

nums[i],nums[nums[i]-1] = nums[nums[i]-1],nums[i] = ...

首先

nums[i]
被更新,然后,
nums[num[i] -1]
被更新,所以第二个分配目标受到第一个更改的影响

第二种情况,

nums[nums[i]-1],nums[i] = ...

首先

nums[nums[i]-1]
更新,然后
nums[i]
更新。
nums[i]
内的
nums[nums[i]-1]
将与第一种情况不同。

© www.soinside.com 2019 - 2024. All rights reserved.