1008 数组元素循环右移问题——20分
一个数组A中存有N(N>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向右移M(M>=0)个位置,即将A中的数据由(A0 A1……AN-1)变换为(AN-M …… AN-1 A0 A1……AN-M-1)(最后M个数循环移至最前面的M个位置)。如果需要考虑程序移动数据的次数尽量少,要如何设计移动的方法?
输入格式
每个输入包含一个测试用例,第1行输入N ( 1<=N<=100)、M(M>=0);第2行输入N个整数,之间用空格分隔。
输出格式
在一行中输出循环右移M位以后的整数序列,之间用空格分隔,序列结尾不能有多余空格。
输入样例
6 2
1 2 3 4 5 6
输出样例
5 6 1 2 3 4
| 代码长度限制 | 时间限制 ||内存限制 |
|16 KB | 400 ms | 64 MB |
思路:要将一个长度为N的数组循环右移M位,可以通过如下三步实现:
①把整个数组倒置
②把现在数组的前M位倒置
③把现在数组的后N-M位倒置
倒置的过程可以使用STL中的reverse函数实现,非常方便
如果要循环右移的位数超过了数组的长度,即M>N,那么只需要将M变成M%N,因为等于N的倍数的移动是多于的,实际上M<=N时这样操作也是可以的,不会影响结果,大家可以在草稿纸上画个小数组来移动验证一下上述理论
代码:
#include<bits/stdtr1c++.h>
using namespace std;
int main() {
int num[105];
int N, M;
cin >> N >> M;
for (int i = 0; i < N; i++) cin >> num[i];
M %= N;
//reverse函数用于反转在[first,last)范围内的顺序
//包括first指向的元素,不包括last指向的元素,左闭右开
reverse(num, num + N);
reverse(num, num + M);
reverse(num + M, num + N);
for (int i = 0; i < N; i++) {
if (i == 0) cout << num[i];
else cout << " " << num[i];
}
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)