左旋字符串是一道面试常考的题,听着好像很难的样子,实际上它并没有想象中的那么难,接下来,我就用两种方式来实现左旋字符串。
方法一
循环左移法(思路)
假如说要左旋两位,那么就把字符串中的前两位保存在另一个字符串str里面,然后将剩下的sub中的字符串整体向前移动。最后将sub中的字符串和str中的字符串进行合并就可以得到想要的左旋过后的字符串了。
具体代码如下
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void StringRverse(char *pStr,int steps)
{
int length=0,i=0;
char *sub=pStr,*str;
while(*pStr !='\0')
{
length++;
pStr++;
}
pStr--;
if(steps > length)
steps=steps-length;
str=(char *)malloc(steps);
for(i=0;i<steps;i++)
str[i]=sub[i];
for(i=0;i<length-steps;i++)
sub[i]=sub[length-steps+i-2];
for(i=0;i<steps;i++)
sub[length-steps+i]=str[i];
}
int main()
{
char a[]="abcdef";
printf("最初的字符串为: \n%s\n",a);
StringRverse(a,2);
printf("左旋两位后为: \n%s\n",a);
system("pause");
return 0;
*方法二
双倍字符串法
双倍字符串法的算法思想不好想但是很好实现,因为它的实现调用了字符串拷贝的库函数。具体方法是将要进行左旋的字符串str拷到另一个字符串sub中,然后再把两个字符串连接,得到双倍字符串。加入要左旋两位,就在sub字符串中从第三个字符开始拷贝,拷贝length长度个,拷到str字符串,这样str字符串里面就是左旋过后的了
代码如下
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<assert.h>
void StringRverse(char *pStr,int steps)
{
int length=0;
char *sub=pStr;
while( *sub !='\0')
{
length++;
sub++;
}
char *tmp=(char *)malloc (sizeof(char)*length*2);
assert(tmp);
strcpy(tmp,pStr);
strcat(tmp,pStr);
strncpy(pStr,tmp+steps,length);
}
int main()
{
char a[]="abcdef";
printf("最初的字符串为: \n%s\n",a);
StringRverse(a,2);
printf("左旋两位后为: \n%s\n",a);
system("pause");
return 0;
}