PAT乙级1008 数组元素循环右移问题 C++ 简单易懂

    科技2022-07-16  144

    PAT乙级 1008 数组元素循环右移问题 C++ 简单易懂

    题目 一个数组A中存有N(>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向右移M(≥0)个位置,即将A中的数据由A0A1⋯AN−1)变换为(AN−M⋯AN−1A0A1⋯AN−M−1)最后M个数循环移至最前面的M个位置)。如果需要考虑程序移动数据的次数尽量少,要如何设计移动的方法?

    输入格式: 每个输入包含一个测试用例,第1行输入N(1≤N≤100)和M(≥0);第2行输入N个整数,之间用空格分隔。

    输出格式: 在一行中输出循环右移M位以后的整数序列,之间用空格分隔,序列结尾不能有多余空格。

    输入样例: 6 2 1 2 3 4 5 6 输出样例: 5 6 1 2 3 4

    思路 题目意思很简洁,只需要数组循环右移,不依靠新数组。 其实很简单,循环右移只需要三步 1.全体数逆序 2.分成的(0,m-1)部分逆序 3.分成的(m-1,n-1)部分逆序 就完成了循环右移。 只是需要满足在公式计算里m是小于等于n的。 所以我们可以把输入的m=m%n;取模运算; 然后也要避免特殊情况,即n=1的时候,输出不能按照数组输出一样,要当特例,直接输出第一个元素,也不需要处理。 循环左移同理也只需要三步 1.(0,m-1)部分逆序 2.(m-1,n-1)部分逆序 3.全体数逆序 不理解可以通过画图来理解这三个步骤 代码

    #include<iostream> using namespace std; void reverse(int a[],int head, int rear)//逆序函数 { int temp=0; while (head<rear) { temp = a[head]; a[head] = a[rear]; a[rear] = temp; head++; rear--; } } int main() { int n; int m; cin >> n>>m; m = m % n; int a[100]; for (int i = 0; i < n; i++) { cin>>a[i]; } if (n == 1) { cout << a[0]; return 0; } reverse(a, 0, n-1); reverse(a, 0,m-1); reverse(a, m ,n-1); for (int i = 0; i < n-1; i++) { cout << a[i]<<" "; } cout << a[n - 1]; return 0; }
    Processed: 0.010, SQL: 8