面试热门题:字符串左旋右旋

来源:互联网 发布:父母干涉爱情知乎 编辑:程序博客网 时间:2024/04/29 20:30

面试的时候有很多这种左旋或者右旋的题目,今天我就把这个题目用不同的方式探讨一下

例题:请实现字符串右循环移位函数,比如:"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);}
好了,今天的分享就这些了,如果还有别的方法欢迎一起学习,如果有什么错误也希望大家能够指出,一起学习哦!









4 0