字符串的移位(要求空间为1,使用翻转的方法)
定义字符串的左旋转操作:把前面若干个移动到尾部。
如把字符串 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;
}
浙公网安备 33010602011771号