首先,它翻转前部分(0 到 N-M-1)。
然后,它翻转后部分(N-M 到 N-1)。
最后,它整体翻转整个数组(0 到 N-1)
#include<iostream>
using namespace std;
// 反转数组的指定范围
void reverseArray(int arr[], int start, int end) {
while (start < end) {
swap(arr[start], arr[end]);
start++;
end--;
}
}
// 循环向右移动数组的数据
void rotateArrayRight(int arr[], int N, int M) {
if (N <= 0 || M < 0 ) {
return; // 无需移动
}
// 翻转前部分 (0 到 N-M-1)
reverseArray(arr, 0, N - M - 1);
// 翻转后部分 (N-M 到 N-1)
reverseArray(arr, N - M, N - 1);
// 整体翻转 (0 到 N-1)
reverseArray(arr, 0, N - 1);
}
int main(){
int n,m;
cin>>n>>m;
if(m>=n){
m%=n;
}
int a[n];
for(int i=0;i<n;i++)
a[i]=0;
for(int i=0;i<n;i++)
cin>>a[i];
rotateArrayRight(a, n, m);
for(int i=0;i<n;i++){
cout<<a[i];
if(i!=n-1)
cout<<" ";
}
return 0;
}
需要注意M可能会大于N,这个时候要进行取余操作
if(m>=n){
m%=n;
}
同样的题型还有循环左移
#include<iostream>
using namespace std;
// 反转数组的指定范围
void reverseArray(int arr[], int start, int end) {
while (start < end) {
swap(arr[start], arr[end]);
start++;
end--;
}
}
// 循环向右移动数组的数据
void rotateArrayRight(int arr[], int N, int M) {
if (N <= 0 || M < 0 ) {
return; // 无需移动
}
// 翻转前部分 (0 到 M-1)
reverseArray(arr, 0, M - 1);
// 翻转后部分 (M 到 N-1)
reverseArray(arr, M, N - 1);
// 整体翻转 (0 到 N-1)
reverseArray(arr, 0, N - 1);
}
int main(){
int n,m;
cin>>n>>m;
if(m>=n){
m%=n;
}
int a[n];
for(int i=0;i<n;i++)
a[i]=0;
for(int i=0;i<n;i++)
cin>>a[i];
rotateArrayRight(a, n, m);
for(int i=0;i<n;i++){
cout<<a[i];
if(i!=n-1)
cout<<" ";
}
return 0;
}