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); } }