3 回答
TA贡献1786条经验 获得超11个赞
我建议使用数组切片,然后将切片添加在一起,以执行旋转。
def left_rotate(data, num):
return data[num:] + data[:num]
def right_rotate(data, num):
return data[-num:] + data[:-num]
例如
>>> a = [1,2,3,4,5,6,7]
>>> left_rotate(a, 2)
[3, 4, 5, 6, 7, 1, 2]
>>> right_rotate(a, 2)
[6, 7, 1, 2, 3, 4, 5]
另请注意,collections.deque此行为已经可用
>>> from collections import deque
>>> d = deque([1,2,3,4,5,6,7])
>>> d.rotate(2)
>>> d
deque([6, 7, 1, 2, 3, 4, 5])
>>> d.rotate(-2)
>>> d
deque([1, 2, 3, 4, 5, 6, 7])
TA贡献1820条经验 获得超9个赞
在函数 leftRotate 中,
while 循环中有错误。
代替
while (d-1) > 0: leftRotatebyOne(arr, n)
和
while d > 0: leftRotatebyOne(arr, n) d -= 1
TA贡献1813条经验 获得超2个赞
当 时d == 1,while (d-1) > 0:任何时候都不会被执行。而且,你永远不会减少 d。最简单的解决方法是使用循环for _ in range(d):
def leftRotate(arr, d, n):
for _ in range(d):
leftRotatebyOne(arr, n)
注意: Python 有比这更好的旋转方法。这段代码看起来更像C而不是Python。例如,在 Python 中传递数组长度是没有意义的。并且轮换可以在一次分配中完成。
def leftRotate(arr, d):
d %= len(arr)
for _ in range(d):
arr[-1], arr[:-1] = arr[0], arr[1:]
科里·克莱默 (Cory Kramer) 的回答更加Python化。但它有一个错误,并且与你的问题的方法有所不同。错误在于,当请求的旋转次数高于列表的长度时,它不起作用。不同之处在于他们返回一个新列表而不是修改它。这两个问题可以这样解决:
def left_rotate(data, num):
num %= len(data)
data[:] = data[num:] + data[:num]
def right_rotate(data, num):
num %= len(data)
data[:] = data[-num:] + data[:-num]
添加回答
举报