在Python中旋转数组



有一个问题,189在Leetcode上旋转数组。在此处输入链接描述其语句为";给定一个数组,将数组向右旋转k步,其中k为非负"为了更好地理解它,这里有一个例子。在此处输入图像描述

所以,我的代码是

for _ in range(k):
j = nums[-1]
nums.remove(nums[-1])
nums.insert(0, j)

它无法通过其中的一些测试用例。在讨论小组中,我发现了一个代码,声称它已经成功提交,就像一样

for _ in  range(k):
nums.insert(0, nums.pop(-1))

我想知道,这两者之间有什么区别,以及为什么我的代码不能通过一些测试用例。

如果您在python shell[].remove.__doc__上执行此操作,您将看到list.remove的目的是:

删除第一次出现的值。如果值为,则引发ValueError不存在。

在代码中,nums.remove(nums[-1])不会删除最后一项,而是删除最后一个项的值的第一次出现。

例如

如果您有一个值为nums = [2, 4, 8, 3, 4]的列表,如果您执行nums.remove(nums[-1]),则nums的内容将变为[2, 8, 3, 4],而不是您所期望的[2, 4, 8, 3]

只需使用切片:

>>> def rotate(l, n):
...     return l[-n:] + l[:-n]
...
>>> lst = [1, 2, 3, 4, 5, 6, 7]
>>> rotate(lst, 1)
[7, 1, 2, 3, 4, 5, 6]
>>> rotate(lst, 2)
[6, 7, 1, 2, 3, 4, 5]
>>> rotate(lst, 3)
[5, 6, 7, 1, 2, 3, 4]

在您的代码j=nums[-1]中,您正试图插入(0,nums[-](。

在中

for _ in  range(k):
nums.insert(0, nums.pop(-1))

插入其他号码-(0,nums.pop(-1((

cesarv给出的答案很好也很简单,但在大型数组上numpy肯定会表现得更好。考虑:

np.roll(lst, n)

remove()方法将单个元素作为参数,并从列表中删除第一个出现的元素。

pop()方法采用单个参数(索引(。传递给方法的参数是可选的。如果未传递,则默认索引-1将作为参数(最后一项的索引(传递。

如果测试用例在最后一个索引之前有相同的项,那么测试用例将失败。

因此,要更正您的代码,请将remove替换为pop

for _ in range(k):
poppedElement = nums.pop()
nums.insert(0, poppedElement)

或者让它更简洁——

for _ in range(k):
nums.insert(0, nums.pop())

最新更新