定义字符串的左旋转操作:把前面若干个移动到尾部。
如把字符串 abcdef左旋转 2位得到字符串 cdefab。
请实现字符串左旋转的函数要求时间对长度为 n的字符串操作复杂度为 O(n),辅助内存为 O(1)。
分析:把字符串看成有两段组成的,记位XY。左旋转相当于要把字符串XY 变成YX。
我们先在字符串上定义一种翻转的操作,就是翻转字符串中字符的先后顺序。把X 翻转后
记为XT。显然有(XT)T=X。
我们首先对X 和Y 两段分别进行翻转操作,这样就能得到XTYT。
接着再对XTYT 进行翻转操作,得到(XTYT)T=(YT)T(XT)T=YX。正好是我们期待的结果。
#include<iostream> using namespace std; void reverse(char *str,int n) { char *start=str,*end=str+n-1; while(start<end) { char c=*start; *start=*end; *end=c; start++; end--; } } int main() { char string[100];int n; while(cin>>string>>n) { reverse(string,n); reverse(string+n,strlen(string)-n); reverse(string,strlen(string)); cout<<string<<endl; } return 0; }