有些点需要注意

  1. 这里有个需要注意的点。题目要求,程序移动数据的次数尽量少。言外之意,如果 m 远远大于 n,那么,你不应该按照 m 去移动数据,否则,你的数据会一直围着数组绕圈圈,做了相当多的无用功。
  2. 鉴于上述原因,我们将 m = m % n。通过这条运算,我们可以保证每个数据的移动,最坏的情况就是绕数组一圈(严格意义上来讲,这里不满一整圈,还差一点),性能提升了很多。
import java.util.*;


public class Solution {
    /**
     * 旋转数组
     * @param n int整型 数组长度
     * @param m int整型 右移距离
     * @param a int整型一维数组 给定数组
     * @return int整型一维数组
     */
    public int[] solve (int n, int m, int[] a) {
        // write code here
        
        // 这里有个需要注意的点。题目要求,程序移动数据的次数尽量少。言外之意,如果 m 远远大于 n,那么,你不应该按照 m 去移动数据,否则,你的数据会一直围着数组绕圈圈,做了相当多的无用功。
        // 鉴于上述原因,我们将 m = m % n。通过这条运算,我们可以保证每个数据的移动,最坏的情况就是绕数组一圈(严格意义上来讲,这里不满一整圈,还差一点),性能提升了很多。
        m = m % n;
        
        if (1 == n || 0 == m) {
            return a;
        }
        Queue<Integer> queue = new LinkedList<>();
        // 将数组 [0, n-m-1] 范围内的数据先放入队列中
        for (int i = 0; i < (n - m); i++) {
            queue.add(a[i]);
        }
        // 将数组 [n-m, -1] 范围内的数据放入到数组 [0, m-1] 上。(区间 [n-m, -1] 中的 -1 指的是一直到数组的末尾)
        for (int i = 0; i < m; i++) {
            a[i] = a[i + (n - m)];
        }
        // 最后,再把队列中的数据依次放到数组 [m, -1] 上。(区间 [m, -1] 中的 -1 指的是一直到数组的末尾)
        int index = m;
        while (!queue.isEmpty()) {
            a[index] = queue.poll();
            index++;
        }
        return a;
    }
}