有一个问题,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())