方法一:
首先将整个数组整体翻转,然后以k作为临界点左右各自翻转。
public void rotate(int[] nums,int k){
k=k%nums.length;
reverse(nums,0,nums.length-1);
reverse(nums,0,k-1);
reverse(nums,k,nums.length-1);
}
private void reverse(int[] nums,int start,int end){
while(start<end){
int temp=nums[start];
nums[start]=nums[end];
nums[end]=temp;
start++;
end--;
}
}
方法二:
思路:以i=0为起点计算要交换的坐标target,将nums[target]和target保存,用于下一次交换。
class Solution {
public void rotate(int[] nums,int k){
k=k%nums.length;
int count=0;
for(int i=0;count<nums.length;i++){
int cur=i;
int next=nums[i];
do{
int target=(cur+k)%nums.length;
int temp=nums[target];
nums[target]=next;
next=temp;
cur=target;
count++;
}while(cur!=i);
}
}
}