题目:
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.
public class Solution {
public void rotate(int[] nums, int k) {
if(null==nums||nums.length<=0) return;
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);
}
private void reverse(int[] nums,int start,int end){
if(start<0||start>=nums.length||end<0||end>=nums.length) return;
while(start<=end){
if(nums[start]!=nums[end]){
nums[start]^=nums[end];
nums[end]^=nums[start];
nums[start]^=nums[end];
}
start++;end--;
}
}
}
解决方法二: Runtime: 1 ms
public class Solution {
public void rotate(int[] nums, int k) {
if(null==nums||nums.length<=0||k<=0) return;
k=k%nums.length;
int a[] = new int[nums.length];
for(int i=0;i<nums.length;i++){
a[(i+k)%nums.length]=nums[i];
}
for(int i=0;i<nums.length;i++){
nums[i]=a[i];
}
}
}
public class Solution {
public void rotate(int[] nums, int k) {
if(null==nums||nums.length<=0||k<=0) return;
k=k%nums.length;
int count=0;
for(int start=0;count<nums.length;start++){
int current=start;
int pre=nums[start];
do{
int next=(current+k)%nums.length;
int temp=nums[next];
nums[next]=pre;
pre=temp;
current=next;
count++;
}while(start!=current);
}
}
}
参考: