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.
[show hint]
Hint:
Could you do it in-place with O(1) extra space?
Related problem: Reverse Words in a String II
1.use extra space
public void rotate(int[] nums, int k) {
if (nums.length == 0)
return;
int m = k % nums.length;
int j = 0;
int[] newNum = new int[nums.length];
for(int i = nums.length-m; i < nums.length; i++){
newNum[j] = nums[i];
j++;
}
for(int i = 0; i < nums.length-m; i++){
newNum[j] = nums[i];
j++;
}
for(int i = 0; i < nums.length; i++)
nums[i] = newNum[i];
}
2.翻转字符:
public void rotate(int[] nums, int k) {
k %= nums.length;
reverse(nums, 0, nums.length - 1);
reverse(nums, 0, k - 1);
reverse(nums, k, 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--;
}
}
3.映射关系 :
public void Rotate(int[] nums, int k) {
if(nums.Length == 0 || k % nums.Length == 0) return;
int start = 0, i = start, curNum = nums[i], count = 0;
while(count < nums.Length){
i = (i + k) % nums.Length;
int tmp = nums[i];
nums[i] = curNum;
if(i == start){
start++;
i = start;
curNum = nums[i];
}
else curNum = tmp;
count++;
}
}
4.通过不停的交换某两个数字的位置来实现旋转
public void rotate(int[] nums, int k) {
if (nums.length == 0) return;
int n = nums.length;
while ((k %= n) > 0 && n > 1) {
int range = n - k;
for (int i = 1; i <= range; i++) {
int val = nums[n - i];
nums[n - i] = nums[n - i - k];
nums[n - i - k] = val;
}
n = k;
k = n - (range % k);
}
}
1 2 3 4 5 6 7
5 2 3 4 1 6 7
5 6 3 4 1 2 7
5 6 7 4 1 2 3
5 6 7 1 4 2 3
5 6 7 1 2 4 3
5 6 7 1 2 3 4