PAT---1008数组元素循环右移问题

来源:互联网 发布:手机淘宝怎么看淘金币 编辑:程序博客网 时间:2024/05/16 18:46

编程是一种美德,是促使一个人不断向上发展的一种原动力。


一个数组A中存有N(N>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向右移M(M>=0)个位置,即将A中的数据由(A0A1……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 21 2 3 4 5 6
输出样例:
5 6 1 2 3 4
   注:这里介绍3种解法:
1> 大型数组强行后移
2> 翻转数组
3> 选择好位置输入元素
解法一:本方法是刚做时想到的,没什么普遍性,主要思路在于定义一个大型数组,元素后移,然后将最后M个元素覆盖前M个元素即可,
本方法收获在于很精准的了解到了N, M 在数组中移动时候的改变,对数组存储有了一个新的理解。
#include <stdio.h>#include <iostream>using namespace std;int main(){//数据的初始化int N, M, i, j, A[3000], myswap;scanf("%d %d", &N, &M);    for(i = 1; i <= N; i++)        cin>>A[i];M &= N;    //数组后移    for(i = 0; i < M; i++)        for(j = N + i; j >= 1; j--)            A[j + 1] = A[j];    //交换元素    for(i = 1; i <= M; i++)        A[i]= A[N + i];   for(i = 1; i <= N - 1; i++)        cout<<A[i]<<" ";    cout<<A[N];return 0;}

注意:本人写完后怎么也提交不对,后来才知道要加 m%= n;这是因为若移动次数大于N,本方法就会出现输出不存在的数,读者自己分析就懂了,下面也是
解法二:翻转数组,本方法在于点拨如何交换数字,读者自己看,对知识拓展有帮助
#include <algorithm>#include <iostream>using namespace std;void reswap(int a[], int b, int e){    while(b < e){        swap(a[b], a[e]);        b++;        e--;    }}int main(){    int i, n, m;    int *a = new int[n];    //真正的牛人就应该只定义N个字节内存    cin>>n>>m;    m %= n;    for(i = 0; i < n; i++)        cin>>a[i];    //颤抖吧!reswap(a, i, j)函数功能是让a数组中i到j的元素都交换    reswap(a, 0, n - m - 1);    reswap(a, n - m, n - 1);    reswap(a, 0, n - 1);    for(i = 0; i < n - 1; i++)        cout<<a[i]<<" ";    cout<<a[n - 1]<<endl;}

解法三:确定输入位置,这种方法反正我这种菜鸟没想到,后来看别人用JAVA写的才焕然大悟,这也告诉我,别一直用你那种垃圾方法了,真正的世界太大了
#include <iostream>using namespace std;int main(){    int i = 0, j = 0, n, m;    cin>>n>>m;    int *a = new int[n];   //沉迷于new对象无法自拔    m %= n;    //这里存在移动位置大于m    for(; i < n; i++){        if(i + m < n)            cin>>a[i + m];        else            cin>>a[j++];    }    for(i = 0; i < n - 1; i++)        cout<<a[i]<<" ";    cout<<a[n - 1];    return 0;}


原创粉丝点击