Reverse(int* arr, int b, int e) {
for(; b < e; b++, e--)
{
int temp = arr[e]; arr[e] = arr[b]; arr[b] = temp;
}
}
RightShift(int* arr, int N, int k)
{
K %= N;
Reverse(arr, 0, N – K - 1);
Reverse(arr, N - K, N - 1);
Reverse(arr, 0, N - 1);
}
abc defg-->defg abc
方法一:翻转
abc defg ==>cba gfed
cba gfed==>defg abc经过三次翻转;代码如上。
方法二:交换加翻转
abc defgh ==> def abc gh
def abcgh==> def gh c ab
defgh c ab ==>defgh a cb
defga cb==>defga bc
就是将前面能直接交换数据的先交换,最后在对余下的数据进行翻转代码如下:
void reverseTheEnd(int *a,int number,int k ,int n){
int temp = k;
int num;
int space = n-number-k;
while((space!=0)){
if(temp>space){
for(int i=0;i<space;i++){
num = a[i+n-space];
a[i+n-space] = a[number+i];
a[number+i] = num;
}
number = number + space;
temp = n - number - space;
space = n - number - temp;
}
if(temp<=space){
for(int j=0;j<temp;j++){
num = a[number+j];
a[j+number] = a[j+temp+number];
a[j+temp+number] = num;
}
number = number + temp;
space = n-number-temp;
temp = n - number - space;
}
}
}
void reverse(int *a,int total, int k){
if(k==total) return;
int rev = k%total;
int remainder = total%rev;
int temp;
int number = 0;
for(int i=0;i<total/rev-1;i++){
for(int j=0;j<rev;j++){
temp = a[i*rev+j];
a[i*rev+j] = a[(i+1)*rev+j];
a[(i+1)*rev+j] = temp;
}
number = (i+1)*rev;
}
if(remainder){
reverseTheEnd(a,number,k,total);
}
}