P119: Rotate a list N palces to left
向左轮转列表N个位置。比如,给定列表[a, b, c, d, e, f, g, h]
和N为3
,向左轮转后为[d, e, f, g, h, a, b, c]
。测试用例:
from python99.lists.p119 import rotate
def test_rotate():
assert rotate([1, 2, 3, 4, 5, 6], 2) == [3, 4, 5, 6, 1, 2]
assert rotate([1, 2, 3, 4, 5, 6], 5) == [6, 1, 2, 3, 4, 5]
assert rotate([1, 2, 3, 4, 5, 6], -2) == [5, 6, 1, 2, 3, 4]
当向左轮转一个位置时,等同于将列表拆分为头元素和剩余列表,调换位置后再拼接起来。
而向左轮转N个位置可转换为N次向左轮转一个位置。且因轮转而被移到列表末尾的元素依旧保持着原来的顺序。所以,N次向左轮转可以转化为,将列表切分为两个列表,第一个列表长度为N,再调换两个列表位置,最后拼接。
代码实现:
# Rotate a list N places to the left.
def rotate(l, n):
return l[n:len(l)]+l[0:n]