题目:定义字符串的左旋转操作:把字符串前面的若干个字符移动到字符串的尾部。
如把字符串abcdef左旋转2位得到字符串cdefab。
请实现字符串左旋转的函数。要求时间对长度为n的字符串操作的复杂度为O(n),辅助内存为O(1)。
#include<stdio.h>
#include<iostream.h>
void swap(char & a, char &b)
{
char temp;
temp = a;
a = b;
b =temp;
}
void reverse(char *s, int start, int end )
{
int j = end,i =start;
for( ; i<=(start+(end -start)/2);i++)
{
swap(s[i],s[j]);
j--;
}
}
void leftshift(char * s , int strlen, int num_leftshift) //通过三次翻转
{
reverse(s, 0, num_leftshift-1);
reverse(s, num_leftshift,strlen-1);
reverse(s, 0,strlen-1 );
}
int main()
{
char s[ ] = "little things make life beautiful!";
cout<<"before leftshift the string is:"<<s<<endl;
int strlen = sizeof(s)/sizeof(char)-1;
int num_leftshift;
printf("please input the number you want to leftshift: ");
scanf("%d",&num_leftshift);
num_leftshift = num_leftshift%strlen;//允许翻转的位数大于字符串长度,做一个取余运算
leftshift(s,strlen, num_leftshift );
cout<<"after leftshift the string is:"<<s<<endl;
return 0;
}