首先注意题目是向右移
Method 1.申明额外空间 一直移位 进行旋转 代码就不给了会超时
Method 2. 交换 (不论是运用递归交换还是公约数进行移动交换)
这里用递归,主要是把要旋转的进行前后进行交换,不过会遇到前后数目不一样,所以交换完后需要递归下一次前后在进行交换直到交换的前后数目一样。
public void rotate(int[] nums, int k) {
if (k >= nums.length)
k = k % nums.length;
if (k == 0 || nums.length == 0)
return;
int n = nums.length;
int i = k;
swap(nums, i, n - i, 0, n);
}
public void swap(int[] nums, int n, int i, int start, int end) {
int temp = 0;
if (n == i) {
for (int j = 0; j < n; j++) {
temp = nums[start + j];
nums[start + j] = nums[end - i + j];
nums[end - i + j] = temp;
}
} else if (n > i) {
for (int j = 0; j < i; j++) {
temp = nums[start + j];
nums[start + j] = nums[end - i + j];
nums[end - i + j] = temp;
}
swap(nums, n - i, i, start, end - i);
} else if (i > n) {
for (int j = 0; j < n; j++) {
temp = nums[start + j];
nums[start + j] = nums[end - n + j];
nums[end - n + j] = temp;
}
swap(nums, n, i - n, start + n, end);
}
}
Method 3. 反转 可以自己举一个例子 先把要旋转的左右分别反转,再反转整个数组。
public void rotate(int[] nums, int k) {
if(k>=nums.length) k=k%nums.length;
if(k==0|| nums.length==0) return;
reverse(nums, 0, nums.length-1-k);
reverse(nums, nums.length-k, 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--;
}
}