i 移动到 i+m,就是让a[i+m]=a[i],需要注意 i+m 是否越界了,如果越界了,就减去 n。同时要保存a[i+m]的值,然后i 变成 i+m,然后一直重复这个操作就可以。但是要注意,如果 m 和 n 不是互质的,最大公约数为maxcom,则 i 和 i+m 一定是0或maxcom的倍数。移动了n / maxcom后,下标为maxcom整数倍的数组已经在正确的位置,之后移动下标对maxcom取余为1到maxcom-1的下标。

from posix import major
#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# 旋转数组
# @param n int整型 数组长度
# @param m int整型 右移距离
# @param a int整型一维数组 给定数组
# @return int整型一维数组
#
class Solution:
    def solve(self , n: int, m: int, a: List[int]) -> List[int]:
        # write code here
        m1 = m
        if m > n:
            m1 = m - int(m / n) * n
        if m1 == 0:
            return a
        # 求最大公约数为maxcom
        maxcom = self.maxCommon(n,m1)
        for j in range(0,maxcom):
            index1 = j
            x1 = a[j]
            x2 = a[j]
            for i in range(int(n / maxcom)):
                index2 = index1 + m1
                if (index2 + m1) >= n:
                    index2 = index2 - n
                x2 = a[index2]
                a[index2] = x1
                x1 = x2
                index1 = index2
        return a
    def maxCommon(self, n, m) -> int:
        if n % m == 0:
            return m
        c1 = min(m, n - m)
        c2 = n % c1
        while c2 != 0:
            n = max(c1, c2)
            m = min(c1, c2)
            c1 = min(m, n - m)
            c2 = n % c1
        return c1