给定一个整数数组 nums
,将数组中的元素向右轮转 k
个位置,其中 k
是非负数。
注意:
1.(数组索引+轮转次数)% 数组长度 = 新的索引
2.采用两次复制的方法,因为不同的K和数组长度情况不一样。例如nums=[1,2,3,4,5,6,7],k=3.最终结果:[5,6,7,1,2,3,4],那么后半部分截取应该是从索引3开始。但是nums=[1,2,3],k=2,最终结果[2,3,1],后半部分截取应该从索引2开始。索引的值是k
方法一:用另一个数组储存数据
public static void rotate(int[] nums, int k) {
int[] a= new int[nums.length];
for (int i = 0; i < nums.length; i++) {
a[(i + k) % nums.length] = nums[i];
}
System.arraycopy(a,0,nums,0,nums.length);
}
方法2:分步骤翻转数组
nums=[1,2,3,4,5,6,7] k=3
结果=【5,6,7,1,2,3,4】
观察可知翻转全部数组【7,6,5,4,3,2,1】然后前半部分和后半部分分别翻转
public static void rotate(int[] nums, int k) {
k = k % nums.length;
reverse(nums,0,nums.length-1);
reverse(nums,0,k-1);
reverse(nums,k,nums.length-1);
}
public static void reverse(int[]arr,int begin,int end){
int tempt;
while (begin<end){
tempt = arr[begin];
arr[begin] = arr[end];
arr[end] = tempt;
begin++;
end--;
}
}
方法3:数组复制
public void rotate(int[] nums, int k) {
k = k % nums.length;
int [] a =new int[nums.length];
System.arraycopy(nums,0,a,0,nums.length);
System.arraycopy(a,nums.length-k,nums,0,k);
System.arraycopy(a,0,nums,k,nums.length-k);
}