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

    #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;
    }
    

      

  • 相关阅读:
    VS扩展开发 二 从示例程序出发
    VS扩展开发 一 导航
    CLR笔记 二 函数调用
    使用C#调用C++类库
    C#编程常用工具总结
    CLR笔记 一 概述
    C#工程中 使用targets和props实例
    VS C++工程的静态库引用问题
    C#高级编程笔记(三)
    (转)如何让CPU的使用率一直在50%
  • 原文地址:https://www.cnblogs.com/yanglf/p/2758622.html
Copyright © 2011-2022 走看看