1008 数组元素循环右移问题 (20分)
一个数组中存有()个整数,在不允许使用另外数组的前提下,将每个整数循环向右移()个位置,即将中的数据由()变换为()(最后个数循环移至最前面的个位置)。如果需要考虑程序移动数据的次数尽量少,要如何设计移动的方法?
输入格式:
每个输入包含一个测试用例,第1行输入()和();第2行输入个整数,之间用空格分隔。
输出格式:
在一行中输出循环右移位以后的整数序列,之间用空格分隔,序列结尾不能有多余空格。
输入样例:
6 2
1 2 3 4 5 6
输出样例:
5 6 1 2 3 4
解题思路:
(法一),不移动元素,改变printf的输出元素顺序即可。是偷懒的做法。
(法二),设一个额外的数组。增加了空间复杂度,但不符合题目要求,有点是代码简单。
(法三),老老实实按照题目所说,循环右移。严蔚敏老师《数据结构》链表章节中,有对此解法的介绍。先反转前面部分,再反转后面部分,最后再对整体进行反转。三步走策略。
也就是代码中这三行,关键是数字的设定,哪里该减一,哪里不能减一,方法就是用具体数字代入试一试。另外,reverse函数的编写,也是同样,重点是下标的计算,功能是原地反转。
reverse(a, 0, n-m-1);
reverse(a, n-m, n-1);
reverse(a, 0, n-1);
————————————————
版权声明:本文为CSDN博主「zhanggirlzhangboy」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/zhanggirlzhangboy/article/details/82793914
我用的第一个方法过的,第三个方法严谨,但是不好记。
这道题唯一需要注意的地方就是M>N的情况,所以需要记为N-M%N
而不是N-M
。
AC代码:
#include <iostream> using namespace std; int main() { int N, M; int a[105] = {0}; cin >> N >> M; int count = 0; for (int i = 0; i < N; i++) cin >> a[i]; for (int i = N - M % N; i < N; i++) { cout << a[i]; count++; if (count != N)cout << " "; } for (int i = 0; i < N - M%N; i++) { cout << a[i]; count++; if (count != N)cout << " "; } return 0; }
0 条评论