您的位置:首页 > 职场人生

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

2016-06-01 01:34 399 查看
面试的时候有很多这种左旋或者右旋的题目,今天我就把这个题目用不同的方式探讨一下

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


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: