题目:实现一个函数,可以左旋字符串中的k个字符。
例如:ABCD左旋一个字符得到BCDA ABCD左旋两个字符得到CDAB
首先分析题目,先分析ABCD左旋一个字符如何得到BCDA.我们可以看作字符‘A’与下一个字符进行了三次位置交换。如图:
那么将左旋一次的字符串BCDA的第一个字符与下一个字符交换位置得到字符串CDAB如图:
可以发现左旋K个字符串,其实是将左一个字符串循环K次。
所以本题核心是实现左旋一个字符串。
核心代码:
while(count)//count用来控制进行几次交换位置
{
*p ^= *q;// p 指向字符串的第一个字符,q指向字符串的第二个字符
*q ^= *p;
*p ^= *q;
p++;
q++;
count--;
}
然后用while()实现核心代码的外围循环即可,全部代码如下:
#include <stdio.h>
void LeftRevolve(char str[], int num,int i)
{
char *p = &str[0];
char *q = &str[1];
int count = num;
while(i)//左旋字符个数
{
while(count)//count用来控制进行几次交换位置
{
*p ^= *q;// p 指向字符串的第一个字符,q指向字符串的第二个字符
*q ^= *p;
*p ^= *q;
p++;
q++;
count--;
}
p = str;
q = str+1;
count = num;
i--;
}
printf("%s",str);
}
int main()
{
char str[]="ABCD";
int num = sizeof(str)/sizeof(str[0]) - 1;//包含‘\0’;
printf("请输入 k###");
int i = 0;
scanf("%d",&i);
LeftRevolve(str,num-1,i);
return 0;
}
运行结果: