数组循环移位

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

  

原文地址:https://www.cnblogs.com/yanglf/p/2758622.html