交换数组中的元素导致问题

问题描述

新年快乐。我有一个关于在 Python 环境下交换数组中的元素的问题。没有问题的代码是:

def findMissingNumber(nums):
    length = len(nums)
    result = []
    i = 0
    while i < length:
        # num = nums[i]
        target = nums[i] - 1
        if nums[i] != i+1 and nums[i] != nums[target]:
            # swap with the nums[i]-1
            nums[target],nums[i]= nums[i],nums[target]
        else:
            i += 1
    for j in range(length):
        if nums[j] != j+1:
            result.append(j+1)
    return result

print(findMissingNumber([2,3,1,8,2,5,1]))
print(findMissingNumber([2,4,2]))
print(findMissingNumber([2,1]))

答案:

[4,6,7]
[3]
[4]

错误的是:

def findMissingNumber(nums):
    length = len(nums)
    result = []
    i = 0
    while i < length:
        num = nums[i]
        target = num - 1
        if num != i+1 and num != nums[target]:
            # swap with the num-1
            nums[target],num = num,7]
[3,4]
[3,4]

我不知道为什么参考(我应该称之为)引起麻烦。你介意详细解释一下吗。
谢谢。

解决方法

带有注释的固定代码。

def findMissingNumber(nums):
    length = len(nums)
    result = []
    i = 0
    while i < length:
        # num and nums[i] have the same value but doesnt refer to same memory location
        num = nums[i]
        target = num - 1
        if num != i+1 and num != nums[target]:
            # swap with the num-1
            
            # incorrect swap,num value is not referencing the list index,but has a copy of its value,# so instead of swapping value with num,do it from the list like below
            # nums[target],num = num,nums[target]
            
            
            # correct swap
            nums[target],nums[i] = nums[i],nums[target]
        else:
            i += 1
    for j in range(length):
        if nums[j] != j+1:
            result.append(j+1)
    return result

print(findMissingNumber([2,3,1,8,2,5,1]))
print(findMissingNumber([2,4,2]))
print(findMissingNumber([2,1]))

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...