一個數組中存有個整數,在不允許使用另外陣列的前提下,將每個整數回圈向右移個位置,即將中的數據由變換爲(最後個數數回圈移至最前面的個位置)。如果考慮程式移動數據的次數儘可能少,要如何設計移動的方法?
每個輸入包含一個測試用例,第1行輸入和;第2行輸入個整數,之間用空格分隔。
在一行中輸出回圈右移位以後的整數序列,之間用空格分隔,序列結尾不能有多餘空格。
6 2
1 2 3 4 5 6
5 6 1 2 3 4
#include <stdio.h>
#include <malloc.h>
void reserve(int *a, int m, int n){
while(m < n){
a[m]^=a[n]^=a[m]^=a[n];
m++;
n--;
}
}
int main(void){
int *a = NULL, n, m;
scanf("%d %d",&n, &m);
m = m%n;
a = (int *) malloc(sizeof(int)*n);
for(int i = 0; i < n; i++){
scanf("%d",&a[i]);
}
reserve(a, n-m, n -1);
reserve(a, 0, n-m-1);
reserve(a, 0, n-1);
for(int i = 0; i < n; i++){
if(i == n-1){
printf("%d",a[i]);
}else{
printf("%d ",a[i]);
}
}
free(a);
return 0;
}
採用逆序3次的方法進行右移。首先將後個元素進行逆序,再將前面個元素進行逆序,最後再將全部進行一次逆序即可。