给定abcdefghi,且从第三个开始旋转,要求
时间复杂度为O(n),空间复杂度为O(1).
思路:
1、先旋转前三个abc->cba
2、在旋转剩下部分的defghi->ihgfed
3、最后整体旋转cbaihgfed->defghiabc
三个过程用同一个函数就搞定!
源码如下,VC6.0测试通过。
/*
* 左旋转字符串,时间复杂度为O(n)
* 空间复杂度为O(1)
* xtfggef 2012/5/9
*/
#include<stdio.h>
#include<string.h>
/*
* 进行局部旋转
*/
char * invert(char * start,char * end)
{
char tmp,*ptmp = start;
while(start!=NULL&&end!=NULL&&start<end)
{
tmp = *start;
*start = *end;
*end = tmp;
start ++;
end --;
}
return ptmp;
}
/*
* 整体旋转
*/
char * left(char *s,int pos)
{
int len = strlen(s);
invert(s,s+(pos-1));
invert(s+pos,s+(len-1));
invert(s,s+(len-1));
return s;
}
int main()
{
char s[] = "abcdefghij";
puts(left(s,3));
return 0;
}
注意事项:
1、程序中写空格的时候,别忘了切换到英文输入法环境下,否则汇报错:error C2018: unknown character '0xa1'
2、puts()的用法:puts()是C语言的输出函数,类似于printf();
区别在于:
1、puts()包含输出后换行。等价于printf("%s\n",a);
2、puts()函数只能输出字符串,不能数值或进行格式变换