• 数组循环移位


    #include<iostream>
    #include<string>
    
    using namespace std;
    
    //method1
    /*
    简单的办法,可以每次将数组中的元素右移一位,循环k次。
    不妨设k是一个非负的整数,当k为负整数的时候,右移k位,相当于
    左移(-k)位。左移和右移本质上是一样的。大家开始可能会有这样潜在的假设,k<N。事实上,很多时候也的确是这样的。
    但严格来说,我们不能用这样的“惯性思维”来思考问题。尤其在编程的时候,要全面的考虑问题。
    右移k位之后的情形,跟右移k'=k%N位之后的情形一样。考虑到循环右移的特点之后,算法复杂度降为O(N^2),这跟k无关。
    */
    string CycleMove(string arr,int len,int k)
    {
         k=k%len;
      for(int i=0;i<k;i++)
      {
          char temp=arr[len-1];
       for(int j=len-1;j>0;j--)
       {
            arr[j]=arr[j-1];
       }
       arr[0]=temp;
      }
      return arr;
    }
    
    //method2
    /*
    abcd1234右移4位的变换过程可以通过以下步骤完成:
    逆序排列abcd:abcd1234  ->  dcba1234
    逆序排列1234:dcba1234  ->  dcba4321
    全部逆序:    dcba4321  ->  1234abcd
    时间复杂度为O(N)
    */
    void reverse(char* arr,int b,int e) //将arr[b,...,e]反转
    {
         for(;b<e;b++,e--)
      {
           char ch=arr[b];
        arr[b]=arr[e];
        arr[e]=ch;
      }
    }
    
    void CycleMove2(char* arr,int len,int k)
    {
      k=k%len;
         reverse(arr,0,len-k-1);
      reverse(arr,len-k,len-1);
      reverse(arr,0,len-1);
    }
    int main()
    {
         string arr;
      char* str;
      int k,i;
      while(cin>>arr)
      {
       cin>>k;
       int len=arr.length();
       str=new char[len+1];
       for(i=0;i<len;i++)
       {
            str[i]=arr[i];
       }
       str[i]='\0';
       string result=CycleMove(arr,len,k);//调用方法一
       cout<<result<<endl;
       CycleMove2(str,len,k);//调用方法二
       for(i=0;i<len;i++)cout<<str[i];
       cout<<endl;
       delete [] str;
      }
         system("pause");
      return 0;
    }
    

      

  • 相关阅读:
    广东发展银行系统分析师面试问题
    软件开发团队中的个人绩效评价
    高并发下的HashMap问题
    HashMap之equals和hashCode小陷阱
    Java面试中的多线程问题
    Java IO设计模式
    Java IO 流 设计模式
    关于bug的沟通
    Cookie/Session机制详解 <转>
    request.get... getHeader 能取得的信息 参数
  • 原文地址:https://www.cnblogs.com/yanglf/p/2758622.html
Copyright © 2020-2023  润新知