题目:
Rotate an array of n elements to the right by k steps.
For example, with n = 7 and k = 3, the array [1,2,3,4,5,6,7] is rotated to [5,6,7,1,2,3,4].
解题思路:
将数组向右移动k步
代码:
第一种方法:
将数组分为两部分:对这两部分分别逆转,最后再对整体进行逆转
class Solution {
public void rotate(int[] nums, int k) {
//第一种方法:将数组分为两部分:分别逆转,然后整体逆转
if(nums==null || nums.length<=1 || k%nums.length==0)
return;
k = k%nums.length;
int flag = nums.length-k;
reverse(nums,0,flag-1);
reverse(nums,flag,nums.length-1);
reverse(nums,0,nums.length-1);
}
public void reverse(int[] nums, int start,int end){
while(start<end){
int temp = nums[start];
nums[start] = nums[end];
nums[end] = temp;
start++;
end--;
}
}
}
第二种方法:
[1,2,3,4,5,6,7] k=3
将[1,2,3,4]取出来放到一个temp中
数组复制[5,6,7]到nums中
数组复制temp到nums中
class Solution {
public void rotate(int[] nums, int k) {
//第二种方法:复制到新的数组中去
if(nums==null || nums.length==0 || k%nums.length==0)
return;
int n = nums.length;
k = k%n;
int[] temp = Arrays.copyOfRange(nums,0,n-k);
//src:源数组 srcPos:源数组要复制的起始位置;
//dest:目的数组; destPos:目的数组放置的起始位置 length:复制的长度。
System.arraycopy(nums,n-k,nums,0,k);
System.arraycopy(temp,0,nums,k,n-k);
}
}
第三种方法:?????
第一种是原地swap,记录下被挤掉的数再接着swap,需要一些时间举栗子探索规律;
public static void rotate(int[] nums, int k) {
if(nums == null || nums.length <= 1)
return;
k = k%nums.length;
int prev = 0;
int next = 0;
int maxComm = maxCommonDivisor(k,nums.length);
for(int i = 0; i < maxComm;i++){
prev = nums[i];
int j = i+k;
j %= nums.length;
while(j != i){
next = nums[j];
nums[j] = prev;
prev = next;
j+=k;
j%=nums.length;
}
nums[j] = prev;
}
return;
}
private static int maxCommonDivisor(int m, int n){
while (m % n != 0) {
int temp = m % n;
m = n;
n = temp;
}
return n;
}