题目:将数组循环向右移动m(>=0)个位置。
说明:一个数组A中存有N(>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向右移M(≥0)个位置,即将A中的数据由(A0、A1、⋯、AN−1)变换为(AN−M、⋯、AN−1、A0、A1、⋯、AN−M−1)(最后M个数循环移至最前面的M个位置)。
思路:先将数组A中后m个元素倒置,再将前n-m个元素倒置,最后再将整个数组倒置,即可实现将数组循环向右移动m个位置。
示例:将数组1 2 3 4 5 6循环右移两个位置,先将后2个元素倒置得到1 2 3 4 6 5,再将前6 - 2 = 4个元素倒置得到4 3 2 1 6 5,最后将整个数组倒置得到5 6 1 2 3 4。
代码:
#include<iostream>
using namespace std;
void toRever(int * arr,int a ,int b){ // 逆置函数
while(a < b){
int temp = arr[a];
arr[a] = arr[b];
arr[b] = temp;
a ++;
b --;
}
}
int main(){
int n = 0;cin >> n; // 数组A中有n个整数
int m = 0;cin >> m; // 将数组A循环向右移动m个位置
m = m % n; // 避免m太大 (若m == n,则相当于原地不动)
int * A = new int[n];
for(int i = 0 ; i < n ; i ++){
cin >> A[i];
}
toRever(A,0,n-m-1);
toRever(A,n-m,n-1);
toRever(A,0,n-1);
for(int i = 0 ; i < n ; i ++){
cout << A[i];
if(i != n-1)
cout << " ";
else
cout << endl;
}
return 0;
}