有些点需要注意
- 这里有个需要注意的点。题目要求,程序移动数据的次数尽量少。言外之意,如果 m 远远大于 n,那么,你不应该按照 m 去移动数据,否则,你的数据会一直围着数组绕圈圈,做了相当多的无用功。
- 鉴于上述原因,我们将 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;
}
}