按索引交换列表中的值

如何解决按索引交换列表中的值?

我遇到了通过使用索引作为占位符来跟踪出现哪些正整数来交换列表中的值的问题。

问题在这里(来自Leetcode

给定一个未排序的整数数组 nums,找到最小的缺失正整数。

你必须实现一个在 O(n) 时间内运行的算法 并使用恒定的额外空间。

输入:nums = [3,4,-1,1]
输出:2
示例 3

我最初的方法是:

for i in range(len(arr)):
    while arr[i] > 0 and len(arr) > arr[i] and i != arr[i]-1 and arr[i] != arr[arr[i]-1]:
        print('swapping to index ' +  str(i) + ' value ' + str(arr[arr[i] - 1]))
        print('swapping to index ' + str(arr[i]-1) + ' value ' + str(arr[i]))
        arr[i],arr[arr[i] - 1] = arr[arr[i] - 1],arr[i]
        print(arr)

但是这个输出

swapping to index 0 value -1
swapping to index 2 value 3
[-1,3,1]
swapping to index 3 value -1
swapping to index 0 value 1
**[-1,1,-1]** (??)

而如果我设置一个变量 j = arr[i] - 1 并运行相同的代码

for i in range(len(arr)):
    while arr[i] > 0 and len(arr) > arr[i] and i != arr[i]-1 and arr[i] != arr[arr[i]-1]:
        j = arr[i] - 1
        print('swapping to index ' +  str(i) + ' value ' + str(arr[j]))
        print('swapping to index ' + str(j) + ' value ' + str(arr[i]))
        arr[i],arr[j] = arr[j],arr[i]
        print(arr)

正确交换

swapping to index 0 value -1
swapping to index 2 value 3
[-1,1]
swapping to index 3 value -1
swapping to index 0 value 1
[1,-1] (as intended)

有人可以向我解释一下吗?

解决方法

当你交换价值时

arr[i],arr[arr[i] - 1] = arr[arr[i] - 1],arr[i]

然后它运行类似

variable = arr[arr[i] - 1],arr[i]
arr[i],arr[arr[i] - 1] = variable

但在第二行它仍然必须分配值 one by one 并且首先它会分配

arr[i] = ...

以后

arr[arr[i] - 1] = ...

但是当它分配第二个值时,arr[i] 将已经有新值而不是旧值 - 这会产生问题。

当您使用 j = arr[i] - 1

arr[j] = ...

然后 j 始终具有旧值 - ant 然后它可以正常工作。

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?