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 条评论

发表评论

Avatar placeholder