思路:把nums数组看作是一个循环队列(就是一个循环数组)。先找到移动后应该出现在0位置的元素。也就是pos=len-k%len;
每移动一步 相当于索引位置反向移动一位。即如果k=1,则pos移动到数组末尾,如果k=2,pos移动到数组倒数第二个位置。
找到移动后的起始位置后,就可以依次按顺序取值。把索引0看作接在数组最后面的元素。等等
代码:
public class Solution {
public void rotate(int[] nums, int k) {
int len=nums.length;
/* int[] tt=new int[k+1];
for(int i=0;i<k;i++)
tt[i]=nums[len-k+i];
for(int i=len-k-1;i>=0;--i)
nums[k+i]=nums[i];
for(int i=0;i<k;++i)
nums[i]=tt[i];*/
int nt[] = new int[len];
int pt=k%len;
int pos=len-pt;
for(int i=0;i<len;i++)
nt[i]=nums[(pos+i)%len];
for(int i=0;i<len;++i)
nums[i]=nt[i];
}
}
别人的代码:
- void rotate(int nums[], int n, int k) {
- k = k % n;
- if (k == 0) return;
- int *temp = new int[n];
- memcpy(temp, nums+(n-k), sizeof(int)*k);
- memcpy(temp+k, nums, sizeof(int)*(n-k));
- memcpy(nums, temp, sizeof(int)*n);
- delete[] temp;
- }