一个数组A中存有N(>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向右移M(≥0)个位置,即将A中的数据由(A0A1⋯AN−1)变换为(AN−M⋯AN−1A0A1⋯AN−M−1)(最后M个数循环移至最前面的M个位置)。如果需要考虑程序移动数据的次数尽量少,要如何设计移动的方法?
Python
s = list(map(int,input().split())) #s[0] = N,s[1] = M
def move(num,p,t1,t2):
for i in range(p):
num[t1+i],num[t2-p+i+1] = num[t2-p+i+1],num[t1+i]
return num
if s[0] > 0:
num = list(map(int,input().split())) #num = N个整数
p = s[1] % s[0] #p = 偏移量
t1 = 0
t2 = len(num) - 1
flag = True
while p != 0:
temp = t2 - t1 + 1
p = p % temp
if p > (temp // 2):
p = temp - p
p = p % temp
flag = not flag
move(num,p,t1,t2)
if flag:
t1 += p
else:
t2 -= p
for i in range(len(num)-1):
print(num[i],end = ' ')
print(num[-1])