题解:
从a[0]开始右移,每次把数直接移动到目标位置,将目标位置替换到变量 buf 中缓存。下一次把 buf 区的数移到目标位置,再替换出新的数,以此反复。只要移动数组个数的次数,就可移动完毕。
特殊情况处理:
1、如果右移距离是数组长度的倍数,那就直接返回原数组。
2、如果右移距离大于数组长度,则直接将右移距离取余,当作小于的情况,方便处理。
3、如果数组长度是右移距离的倍数(b)的话。那么每移动b次,都会开始重复,于是每移动b次,就得往下走(即b次中的第一次得往下走一个),下个轮回。
#
# 旋转数组
# @param n int整型 数组长度
# @param m int整型 右移距离
# @param a int整型一维数组 给定数组
# @return int整型一维数组
# 整体思想:从a[0]开始右移,目标位置替出来到缓冲区buf。循环数组个数,就能把整个数组右移完。移动数据的次数最大为n。
class Solution:
    def solve(self , n , m , a ):
        if m%n == 0:    # 如果右移距离是长度的倍数,那就直接返回原数组
            return a
        m = m%n    # 右移次数大于数组长度的话当作右移大于数组长度多少来处理。
        index = m    # 初始位置设置在第一个要被换走的数
        start = 0
        buf = a[start]
        if n%m == 0:    # 如果数组长度是右移距离的倍数,那移动倍数此之后,就得换到从a[1]开始移动的地方了。不然会重复移动,是不同轮回的
            time = n/m
            for i in range(n):
                if time==0:
                    start += 1
                    buf = a[start]
                    index = (start+m)%n
                    time = n/m
                a[index],buf = buf,a[index]
                index = (index+m)%n
                time -= 1
        else:
            for i in range(n):    # 如果不是整数倍,那一直移动下去都不会重复。
                a[index],buf = buf,a[index]
                index = (index+m)%n
        return a
        # write code here