旋转数组
(牛客网—牛客题霸算法篇—NC110)
题目描述
一个数组A中存有 n 个整数,在不允许使用另外数组的前提下,将每个整数循环向右移 M( M >=0)个位置,即将A中的数据由(A0 A1 ……AN-1 )变换为(AN-M …… AN-1 A0 A1 ……AN-M-1 )(最后 M 个数循环移至最前面的 M 个位置)。如果需要考虑程序移动数据的次数尽量少,要如何设计移动的方法?
数据范围:0 < n \le 100<n≤10,0 \le m \le 10000≤m≤1000
进阶:空间复杂度 O(1),时间复杂度 O(n)
思路
Java实现
使用两层for循环实现
外层for循环为移动的次数,内层for循环用于数据的移动
注意问题
要注意数组越界的情况,在移动过程中,要注意数组大索引向数组小索引移动时的情况,因此新索引是在旧索引移动的基础上对数组长度取余得到的。
代码实现
import java.util.*;
public class Solution {
public int[] solve (int n, int m, int[] a){
// write code here
int temp=0;
for(int j=0;j<m;j++){
temp=a[n-1];
for(int i=n-1;i>0;i--){
a[i]=a[(i-1)%n];
}
a[0]=temp;
}
return a;
}
}