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