有没有人可以帮我看看这段代码。 我试图在leetcode中解决第一个缺失的正面问题。 但是这个代码导致无限循环,因为我发现我无法交换A [i]和A [A [i] -1]。但我测试使用这个简单的代码交换到列表中的元素:
A = [2,1]
A[0], A[1] = A[1], A[0]
print A # A = [1,2]
我不知道错误是什么:(
def firstMissingPositive(self, A):
i = 0
length = len(A)
while i < length:
if A[i] >= 1 and A[i] <= length:
if A[i] != i+1 and A[A[i]-1] != A[i]:
A[i], A[A[i]-1] = A[A[i]-1], A[i]
else:
i += 1
else:
i += 1
for i in range(length):
if A[i] != i+1:
return i+1
return length + 1
答案 0 :(得分:5)
您在执行转让声明期间修改A[i]
,因此A[A[i]-1]
左侧=
的评估赢了评估你对它的期望。你需要改变这个:
A[i], A[A[i]-1] = A[A[i]-1], A[i]
到此:
tmp = A[i]-1
A[i], A[tmp] = A[tmp], A[i]
Python Language Reference中的注释解决了这一现象:
警告:虽然分配的定义意味着左手侧和右手侧之间的重叠是安全的&#39; (例如
a, b = b, a
交换两个变量),重叠 分配给变量的集合是不安全的!例如,以下程序打印[0, 2]
:x = [0, 1] i = 0 i, x[i] = 1, 2 print x