【发布时间】:2019-09-15 11:18:22
【问题描述】:
我有一个由连续整数[1, 2, 3, ..., n] 组成的无序数组,没有任何重复。允许交换任意两个元素。我需要找到按升序对数组进行排序所需的最小交换次数。
从列表的第一个元素开始,我尝试将它们放在正确的位置(例如,如果第一个元素是 7,它应该在列表的第 6 位)。为了在列表中逐一进行,我制作了一个副本,然后在第二个列表中进行交换。
a = [4,3,1,2]
b = a[:]
swap = 0
for p in a:
if (p!= b[p-1]):
b[p-1], b[b.index(p)] = b[b.index(p)], b[p-1]
swap+=1
print(swap)
此代码有效,但在这种情况下,我必须交换列表中位置为 0 或 1 的两个元素。我不明白为什么?因为我没有超出限制。
谁能解释一下为什么会这样?
例如,如果我打印 p,两个发生交换的索引,更新的 b 列表和更新的交换次数:
p = 4
idx1= 3 idx2= 0
b= [2, 3, 1, 4]
swap = 1
p = 3
idx1= 2 idx2= 1
b= [2, 1, 3, 4]
swap = 2
p = 1
idx1= 0 idx2= 1
b= [2, 1, 3, 4]
swap = 3
p = 2
idx1= 1 idx2= 0
b= [1, 2, 3, 4]
swap = 4
在这种情况下,您可以看到对于 p = 1,当索引为 0 和 1 时,不会发生交换。
我把b[p-1],b[b.index(p)]的顺序改了,就没有同样的问题了,但是不明白是什么原因。
【问题讨论】:
-
你能具体说明你遇到了什么错误吗?
-
你有一个由连续个整数组成的无序数组?这不会使数组有序吗?
-
当你看到错误时,你能举个例子吗?
-
这很难理解。首先,您没有向我们展示生成您发布的输出跟踪的代码:发布的代码最后只有一个
print。我们不知道这些值是什么时候产生的。其次,您说您已经更改了代码并且它现在可以工作了。我尝试将prints 插入 I 将它们放置的位置,但我没有得到你给定的输出。 -
最近有很多这样的问题。简短的回答是,停止尝试像这样复杂的交换。首先计算
b.index(p),然后进行a, b = b, a风格的交换。