面试热门题:字符串左旋右旋
2016-06-01 01:34
399 查看
面试的时候有很多这种左旋或者右旋的题目,今天我就把这个题目用不同的方式探讨一下
例题:请实现字符串右循环移位函数,比如:"abcdefg"循环右移3位就是"efgabcd";
第一种方法:三目旋转法,三目旋转法的思想就是先把字符串整个逆置,然后需要旋转几位就逆置前几个,最后逆置后面的字符
如下图所示:
![](http://img.blog.csdn.net/20160601012021914?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
代码实现:
第二种方法是暴力强转法,
暴力强转法是指先把最后的非‘’\0‘’的字符保存到临时变量tmp里,然后从后往前把字符一个一个往后一个位置上移动,最后将tmp保存到第一个字符的位置上,循环需要旋转的字符个数,就可以得到旋转好的字符串了
具体步骤如下图所示:
![](http://img.blog.csdn.net/20160601012734997?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
代码实现:
例题:请实现字符串右循环移位函数,比如:"abcdefg"循环右移3位就是"efgabcd";
第一种方法:三目旋转法,三目旋转法的思想就是先把字符串整个逆置,然后需要旋转几位就逆置前几个,最后逆置后面的字符
如下图所示:
代码实现:
void RightLoopMove(char *pStr, unsigned short steps) { assert(pStr); int len = strlen(pStr); _reserve(pStr, pStr, pStr + len-1);//len-1是字符串pStr的最后一个不是\0字符的位置,逆置整个字符串 _reserve(pStr, pStr, pStr + steps - 1);//逆置前面部分 _reserve(pStr, pStr + steps, pStr + len - 1);//逆置后面部分 printf("%s\n", pStr); } void _reserve(char *str, char *left, char *right) { assert(str);//用assert断言,以免出错 assert(left); assert(right); while (left < right)//循环终止的条件是左边小于右边 { char tmp = 0; tmp = *left; *left = *right; *right = tmp; left++; right--; } }
第二种方法是暴力强转法,
暴力强转法是指先把最后的非‘’\0‘’的字符保存到临时变量tmp里,然后从后往前把字符一个一个往后一个位置上移动,最后将tmp保存到第一个字符的位置上,循环需要旋转的字符个数,就可以得到旋转好的字符串了
具体步骤如下图所示:
代码实现:
void RightLoopMove(char *pStr, unsigned short steps) { assert(pStr); int len = strlen(pStr); int i = len - 1; while (steps--) { char tmp = *(pStr + len - 1); for (int i = len - 1; i >= 0; i--) { pStr[i] = pStr[i - 1]; } pStr[0] = tmp; } printf("%s\n", pStr); }好了,今天的分享就这些了,如果还有别的方法欢迎一起学习,如果有什么错误也希望大家能够指出,一起学习哦!