解法一 每次移动移位,然后循环调用K次:
void shift(int *A,int n,int k){
for(int i=0;i<k;i++){
int last=A[n-1];
for(int j=n-1;j<0;j--)
A[j]=A[j-1];
A[0]=last;
}
}
解法二 优化循环次数,即求K对n的余数:
void shift(int *A,int n,int k){
k%=n;
for(int i=0;i<k;i++){
int last=A[n-1];
for(int j=n-1;j<0;j--)
A[j]=A[j-1];
A[0]=last;
}
}
解法三 使用逆转,方法很巧妙:
void reverse(int *A,int start,int end){
for(;start<end;start++,end--){
int temp=A[start];
A[start]=A[end];
A[end]=temp;
}
}
void shift(int *A,int n,int k){
k%=n;
reverse(A,0,n-k-1);
reverse(A,n-k,n-1);
reverse(A,0,n-1);
}