数组的旋转

一个含有n个元素的数组向左旋转i次

原理描述:

假设有一个数组为[ 0 – (n-1) ],要向左旋转i次,数组可以被i分割为两部分[ 0 – (i-1) ]和[ i – (n-1) ] 两部分。如果把第一部分[ 0 – (i-1)] 反转变为 [ (i-1) – 0 ], 第二部分[ i – (n-1) ] 反转变为 [ (n-1) – i ],现在数组为[ (i-1) – 0 ] [ (n-1)-i ],继续把整个数组进行一次反转 数组变为 [ i – (n-1) ] [ 0 – (i-1) ] , 这就达到了向左3次旋转。
# 测试数据
data = [1,2,3,4,5,6,7,8,9,10,11, 12]

# 反转函数
# 反转列表给定范围内元素数据
def reverse(data, start, end): 
    while start < end:
        data[start], data[end] = data[end], data[start]
        start += 1
        end -= 1


# 旋转函数
# data 输入列表数据
# i 大于 0 向左旋转i次 eg:i = 3 向左旋转3次
# i 小与 0 向右旋转-i次 eg:i = -3 向右旋转3次
def rotate(data, i):
    i = i % len(data)
    reverse(data, 0, i - 1)
    reverse(data, i, len(data) - 1)
    reverse(data, 0, len(data) - 1)


print("原数据:", end = "")
print(data)
rotate(data, -1)
print("旋转后:", end = "")
print(data)

摘自《编程珠玑》

点赞