坑点: 当N-M大于N时,会输出错误,所以需要提前将m = m%n,或者使用数学库将N-M取绝对值再%N;
这道题要么开个辅助空间,利用栈或队列的特性来实现反转,要么就找规律原地翻转,如下:
C语言
#include<iostream>
using namespace std;
void reverse(int a[], int start, int end) {
for(int i = start; i <= (start + end) / 2; i++) {
int temp = a[i];
a[i] = a[start + end - i];
a[start + end - i] = temp;
}
}
int main()
{
int n=0,m=0;cin>>n>>m;
m %= n;//m %= n,以确保m的值不会超过数组的大小。
int a[n];
for(int i=0;i<n;i++)scanf("%d",&a[i]);
reverse(a, 0, n-m-1);
reverse(a, n-m, n-1);
reverse(a, 0, n-1);
printf("%d", a[0]);
for(int i=1; i < n; i++) {
printf(" %d", a[i]);
}
printf("\n");
return 0;
}
c++
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,m;cin>>n>>m;vector<int>a(n);
m%=n; //为了防止要旋转的数超过了数组长度
for(int i=0;i<n;i++)
{
cin>>a[i];
}
reverse(begin(a),begin(a)+n);
reverse(begin(a),begin(a)+m);
reverse(begin(a)+m,begin(a)+n);
for(int i=0;i<a.size();i++)
{
if(i)cout<<" "<<a[i];
else cout<<a[i];
}
return 0;
}
画图举例:
初始状态:
整体翻转:
翻转m位:
翻转剩下的n-m位:
完成翻转。