/*把字符串前面的若干个字符移动到字符串的尾部。
如把字符串abcdef左旋转2位得到字符串cdefab。
请实现字符串左旋转的函数,要求对长度为n的字符串操作的时间复杂度为O(n),
空间复杂度为O(1)。*/
#include <iostream>
using namespace std;
//第一种
void Function1(char str[],int len,int k);
//第二种
void Function2(char str[],int len,int k);
void Reverse(char str[],int pre,int las);
int main()
{
char str1[]={"1234abcd"};
char str2[]={"1234abcde"};
int k = 4;
cout<<"原字符串:"<<endl;
cout<<"str1:"<<str1<<endl;
cout<<"str2:"<<str2<<endl;
Function1(str1,strlen(str1),k);
Function2(str2,strlen(str2),k);
return 0;
}
void Function1(char str[],int len,int k)
{
k = k % len;
while(k--)
{
char c = str[len-1];
for(int i = len - 1; i > 0; i--)
{
str[i] = str[i-1];
}
str[0] = c;
}
cout<<"Function1:"<<str<<endl<<endl;
}
void Function2(char str[],int len,int k)
{
Reverse(str,0,k-1);
Reverse(str,k,len-1);
Reverse(str,0,len-1);
cout<<"Function2:"<<str<<endl;
}
void Reverse(char str[],int pre,int las)
{
char c;
for(int i = pre; i <= pre + (las - pre)/2; i++)
{
c = str[i];
str[i] = str[las - i + pre];
str[las - i + pre] = c;
}
}