zoukankan      html  css  js  c++  java
  • 2.17 数组循环移位

    题目:设计一个算法,把一个含有N个元素的数组循环右移K位,要求时间复杂度为O(n),且只允许使用两个附加变量。

     
    分析:首先,容易忽略K>N的情况,好大一个陷阱啊,有木有TAT。再次,分享下本弱菜的错误思路,错得很经典 = =!
    WA:不采用一次性连续移动整体的方法,每次只移动有关联的元素。例如第一次移动 temp←a[n]←a[n-k]←a[n-2*k]←a[n-3*k].....最后将temp赋值给最后一个数,
    貌似是正确的,错在没意识到这些元素是并不一定是首尾相接的(即头元素、尾元素不一定隔着K个单位)!
     
    还是学习下书本的神算法吧:假设原数组序列为abcd1234,要求循环右移4个单位,即要得到1234abcd,不难看出,其中2段的顺序是不变的:1234和abcd,可把这两段看成两个整体。右移K位的过程就是把数组的两部分交换一下。可通过以下步骤完成:
    1、逆序排列abcd: abcd1234→dcba1234
    2、逆序排列1234:dcba1234→dcba4321
    3、全部逆序:dcba4321→1234abcd
     
    Code:
     
    #include<iostream>
    #include<algorithm>
    
    using namespace std;
    
    int a[1000];
    
    void reverse(int b,int e)
    {
        for(;b<e;b++,e--)
        {
            int t=a[b];
            a[b]=a[e];  
            a[e]=t;           
        }     
    }
    
    int main()
    {
        int n,k;
        cin>>n>>k;
        k%=n;
        for(int i=0;i<n;i++)
            cin>>a[i];
        
        reverse(0,n-k-1);
        reverse(n-k,n-1);
        reverse(0,n-1);
        
        for(int i=0;i<n;i++)
            cout<<a[i]<<"  ";
        cout<<endl;
        system("pause");
        return 0;
    }
  • 相关阅读:
    C语言II博客作业03
    C语言II博客作业02
    C语言II博客作业01
    学期总结
    C语言I博客作业08
    C语言I博客作业07
    C语言I博客作业06
    C语言|博客作业05
    C语言I博客作业04
    【lhyaaa】2020深圳大湾区比赛总结
  • 原文地址:https://www.cnblogs.com/icfnight/p/3253757.html
Copyright © 2011-2022 走看看