3 回答

TA貢獻1786條經(jīng)驗 獲得超11個贊
我建議使用數(shù)組切片,然后將切片添加在一起,以執(zhí)行旋轉(zhuǎn)。
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此行為已經(jīng)可用
>>> 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條經(jīng)驗 獲得超9個贊
在函數(shù) leftRotate 中,
while 循環(huán)中有錯誤。
代替
while (d-1) > 0: leftRotatebyOne(arr, n)
和
while d > 0: leftRotatebyOne(arr, n) d -= 1

TA貢獻1813條經(jīng)驗 獲得超2個贊
當(dāng) 時d == 1,while (d-1) > 0:任何時候都不會被執(zhí)行。而且,你永遠不會減少 d。最簡單的解決方法是使用循環(huán)for _ in range(d):
def leftRotate(arr, d, n):
for _ in range(d):
leftRotatebyOne(arr, n)
注意: Python 有比這更好的旋轉(zhuǎn)方法。這段代碼看起來更像C而不是Python。例如,在 Python 中傳遞數(shù)組長度是沒有意義的。并且輪換可以在一次分配中完成。
def leftRotate(arr, d):
d %= len(arr)
for _ in range(d):
arr[-1], arr[:-1] = arr[0], arr[1:]
科里·克萊默 (Cory Kramer) 的回答更加Python化。但它有一個錯誤,并且與你的問題的方法有所不同。錯誤在于,當(dāng)請求的旋轉(zhuǎn)次數(shù)高于列表的長度時,它不起作用。不同之處在于他們返回一個新列表而不是修改它。這兩個問題可以這樣解決:
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]
添加回答
舉報