int gcd(int n,int m){
if(m==0) return n;
return gcd(m,n%m);
}
void rotate(int* nums, int numsSize, int k) {
int start,current,tmp,next,l;
//右移转化为左移
if(k>numsSize) k=numsSize-k%numsSize;
else k=numsSize-k;
if(k==0) return;
l=gcd(numsSize,k);
for(int i=0;i<l;i++){
start=current=i;
tmp=nums[start];
while(1){
next=(current+k)%numsSize;
if(next==start) break;
nums[current]=nums[next];
current=next;
}
nums[current]=tmp;
}
}
另一种解法
void rotate(int* nums, int numsSize, int k) {
k=k % numsSize;
int count=0;
for(int start=0;count<numsSize;start++){
int current=start;
int pre=nums[start];
do{
int next=(current+k)%numsSize;
int tmp=nums[next];
nums[next]=pre;
pre=tmp;
current=next;
count++;
}while(start!=current);
}
}