zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    sublime开启vim模式
    git命令行界面
    搬进Github
    【POJ 2886】Who Gets the Most Candies?
    【UVA 1451】Average
    【CodeForces 625A】Guest From the Past
    【ZOJ 3480】Duck Typing
    【POJ 3320】Jessica's Reading Problemc(尺取法)
    【HDU 1445】Ride to School
    【HDU 5578】Friendship of Frog
  • 原文地址:https://www.cnblogs.com/xiongmao-cpp/p/6364674.html
Copyright © 2011-2022 走看看