• 1008. 数组元素循环右移问题 (20)


    1008. 数组元素循环右移问题 (20)
    
    一个数组A中存有N(N>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向右移M(M>=0)个位置,即将A中的数据由(A0 A1……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 2
    1 2 3 4 5 6
    输出样例:
    5 6 1 2 3 4

    分析:

    (1)考研408曾经出过这道题目。其做法是先将前0~n-m-1翻转,再将n-m~n-1翻转,最后再整体进行数组的翻转,就能在不增加空间的情况下实现题目中的结果。还需要注意的是m可能会比n大,这时,为了减少不必要的移动,将m对n取余,因为对一个数组进行循环移动m和m+n的结果是一样的。代码如下:

    //way 1:
    #include <iostream>
    using namespace std;
    
    void swap(int a[],int from,int to)
    {
        while(from<to)
        {
            int tmp;
            tmp=a[from];
            a[from]=a[to];
            a[to]=tmp;
            from++;
            to--;
        }
    }
    
    int main()
    {
        int n,m;
        cin>>n>>m;
        int a[110];
        m=m%n;
        for(int i=0;i<n;i++)
        {
            cin>>a[i];
        }
        swap(a,0,n-m-1);
        swap(a,n-m,n-1);
        swap(a,0,n-1);
        for(int i=0;i<n;i++)
        {
            if(i!=0)
            {
                cout<<" ";
            }
            cout<<a[i];
        }
        cout<<endl;
        return 0;
    }

     (2)第二种做法是:开2*N大小的数组,在输入数组时紧接着后面拷贝一份。输出时,从下标n-m依次输出n个数即可。代码如下:

    // way 2:
    #include <iostream>
    #include <cstdio>
    using namespace std;
    int a[300];
    int main(void)
    {
        int n,m;
        cin>>n>>m;
        m=m%n;
        for(int i=0;i<n;i++)
        {
            cin>>a[i];
            a[i+n]=a[i];
        }
        int index=n-m;
        for(int i=0;i<n;i++)
        {
            if(i!=0)
            {
                cout<<" ";
            }
            cout<<a[index];
            index++;
        }
        cout<<endl;
        return 0;
    }
  • 相关阅读:
    Java JMX 监管
    Spring Boot REST(一)核心接口
    JSR 规范目录
    【平衡树】宠物收养所 HNOI 2004
    【树型DP】叶子的颜色 OUROJ 1698
    【匈牙利匹配】无题II HDU2236
    【贪心】Communication System POJ 1018
    【贪心】Moving Tables POJ 1083
    Calling Extraterrestrial Intelligence Again POJ 1411
    【贪心】Allowance POJ 3040
  • 原文地址:https://www.cnblogs.com/xiongmao-cpp/p/6364674.html
Copyright © 2020-2023  润新知