您的位置:首页 > Web前端

剑指offer—左旋转字符串

2016-05-20 17:12 381 查看
题目:字符串的左旋转操作时把字符串前面的若干个字符转移到字符串尾部。请定义一个函数实现字符串左旋转操作的功能。比如输入字符串“abcdefg”和数字2,该函数将返回左旋转2位得到结果“cdefgab”

对于这一道题,按照普通的思想我们的想法一般都是先把字符a取出来,然后把后面你的字符串向前移动,然后把a放到最后。然后依次再把b进行一次,就可以了。



代码:

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<string.h>
void revolve_left(char str[], int k)
{
assert(str);
int len = strlen(str);//求得字符串的长度
char tmp = 0;//用来保存你要移位的字符
if (k < len)
{
for (int i = 0; i < k; i++)
{
tmp = str[0];
for (int j = 0; j < len - 1; j++)
{
str[j] = str[j + 1];//对后面的字符串向前移位,
}
str[len - 1] = tmp;//把第一个字符放到最后的位置
}
}
else
{
exit(1);
}
}
int main()
{
char str[] = "abcdefg";
int k = 0;
printf("输入你所需要旋转的字符个数:");
scanf("%d", &k);
revolve_left(str, k);
printf("%s\n", str);
system("pause");
return 0;
}


上述程序就可以达到我们所要求的了,但是,其实有一种更为优化的方式可以来做这个,在这里我们把这个称为三步反转法



#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<string.h>
void reverse(char *left,char *right)
{
while (left < right)
{
char tmp = *left;
*left = *right;
*right = tmp;
left++;
right--;

}
}
void revolve_left(char *str, int k)
{
int len = strlen(str);
assert(str);
if (k<len&&k>0 && len > 0)
{
reverse(str, str + k - 1);//第一步反转前一部分
reverse(str + k, str + len - 1);//第二步反转第二部分
reverse(str, str + len - 1);//第三步反转整体
}
}
int main()
{
char str[] = "abcdefg";
int k = 0;
printf("输入你所需要旋转的字符个数:");
scanf("%d", &k);
revolve_left(str, k);
printf("%s\n", str);
system("pause");
return 0;
}


上面就是一种最快实现字符串左旋转操作的方法,接下来我们也来看一下右旋转操作的方法,类似依然使用三步旋转法。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<assert.h>
void reverse(char *p, char *q)
{
while (p < q)
{
char tmp = *p;
*p = *q;
*q = tmp;
p++;
q--;
}

}
void RightLoopMove(char *pStr, unsigned short steps)
{
int len = strlen(pStr);
assert(pStr);
reverse(pStr + len - steps, pStr + len-1);
reverse(pStr, pStr + len - steps-1);
reverse(pStr , pStr + len-1);
}
int main()
{
char str[] = "abcdefg";
RightLoopMove(str, 2);
printf("%s\n", str);
system("pause");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: