尝试交换值以建立定序列表(来自HackerRank问题-Minimum Swaps 2),并且代码在大多数测试用例中均有效,但在大数据集上超时。有什么更好的方法可以编写以下代码:
因此,初始列表4 3 1 2应该是经过最小交换次数后的1 2 3 4。
# arr[] = 4 3 1 2 ->
for i in range(len(arr), 0, -1):
if i != arr[i-1]:
arr[i-1], arr[arr.index(i)] = arr[arr.index(i)], arr[i-1]
swap += 1
return swap
答案 0 :(得分:1)
使用字典来保存索引,而不是每次循环都使用arr.index(i)
。执行交换时,请相应地更新索引字典。
indexes = {el:i for i, el in enumerate(arr)}
for i in range(len(arr), 0, -1):
if i != arr[i-1]:
index = indexes[i]
indexes[i] = i - 1
indexes[arr[i-1]] = index
arr[i-1], arr[index] = arr[index], arr[i-1]
swap += 1
return swap
即使使用arr.index(i)
,也需要在交换之前对其进行一次调用。左侧的目标表达式是按顺序求值的,因此对arr[i-1]
的赋值可能会更改arr.index(i)
的结果,而当您将赋值给arr[arr.index(i)]
时,最终将赋给错误的位置
答案 1 :(得分:-1)
一个更简单的解决方案是不使用字典,甚至不用管理索引。
只需将弹出的值从开头追加到数组的末尾即可。
for i in range(len(arr), 0, -1):
arr.append(arr.pop(0))
return arr
这使用内置的python函数将问题简化为单行循环。