原题网址:https://leetcode.com/problems/rotate-array/
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]
.
Note:
Try to come up as many solutions as you can, there are at least 3 different ways to solve this problem.
Related problem: Reverse Words in a String II
方法一:使用临时空间。
public class Solution {
public void rotate(int[] nums, int k) {
k = k % nums.length;
if (k == 0) return;
int[] buf = new int[k];
for(int i=0; i<k; i++) buf[i] = nums[nums.length-k+i];
for(int i=nums.length-1; i>=k; i--) nums[i] = nums[i-k];
for(int i=0; i<k; i++) nums[i] = buf[i];
}
}
方法二:逐个向前推移,直到所有元素都在目标位置。
public class Solution {
private int gcd(int a, int b) {
if (a < b) {
int t = a;
a = b;
b = t;
}
while (b > 0) {
int t = a % b;
a = b;
b = t;
}
return a;
}
public void rotate(int[] nums, int k) {
k = k % nums.length;
int g = gcd(nums.length, k);
int l = nums.length * k / g;
for(int i=0; i<g; i++) {
int last = nums[(i+k)%nums.length];
for(int j=0; j<l; j+=k) {
int next = nums[(i+j+k)%nums.length];
nums[(i+j+k)%nums.length] = last;
last = next;
}
nums[(i+k)%nums.length] = last;
}
}
}
方法三:翻转。
public class Solution {
private void reverse(int[] nums, int from, int to) {
while (from < to) {
nums[from] ^= nums[to];
nums[to] ^= nums[from];
nums[from] ^= nums[to];
from ++;
to --;
}
}
public void rotate(int[] nums, int k) {
k = k % nums.length;
reverse(nums, 0, nums.length-k-1);
reverse(nums, nums.length-k, nums.length-1);
reverse(nums, 0, nums.length-1);
}
}