pat乙级1008. 数组元素循环右移问题 (20)

欢迎访问我的pat乙级题解目录哦https://blog.csdn.net/richenyunqi/article/details/84981369

题目描述

pat乙级1008. 数组元素循环右移问题 (20)_第1张图片

算法设计

这道题并不会真的去检测你用不用额外的数组,所以即使用了额外的数组空间也能通过。下面利用样例说明一下不用额外数组的算法:

对于给出的样例1 2 3 4 5 6来说,要循环右移两位,可以先把数字5从数组中取出存储到一个额外变量之中,然后将数组中5前面的元素统一后移一位,然后将5赋值到数组中这些后移的数字之前,最后得到的结果为5 1 2 3 4 6 。对数字6采取一致的方法,将6从数组中取出存储到额外变量之中,然后将数组中6前面的元素(注意这里移动的仍然是1 2 3 4,5不移动)统一后移一位,然后将6赋值到数组中这些后移的数字之前,最后得到的结果为5 6 1 2 3 4 ,算法执行完毕。

注意点:

算法比较简单,有几个点注意一下就好:

(1)题目中并没有M

(2)很明显,需要循环右移几次,上述的算法就需要执行几次,可以将这一特点作为循环截止条件。

(3)为保证移动次数最少,应该保证上述算法执行过程是从左至右。比如样例1 2 3 4 5 6,应该先取出5再取出6,如果先取出6后取出5,取数字的过程中需要后移数字的数量均为5,要比先取出5再取出6的方式后移次数多。

(3)在同一后移的过程要确定好移动的数字的位置以及移动之后将临时变量中储存的数还原到数组中的位置。

C++代码:

#include
using namespace std;
int main(){
    int N,M;
    scanf("%d%d",&N,&M);
    int a[N];
    for(int i=0;i=N)//如果M>=N,需要取余
        M%=N;
    for(int i=0;ii;--j)//将需要移动的数后移一位
            a[j]=a[j-1];
        a[i]=temp;//将保存的临时变量赋值到数组中
    }
    for(int i=0;i0?" ":"",a[i]);
    }
    return 0;
}

 

你可能感兴趣的:(pat乙级)