实现一个函数,可以左旋字符串中的k个字符。
例如:
ABCD左旋一个字符得到BCDA
ABCD左旋两个字符得到CDAB
小编想说刚拿到这个题目各位友友会觉得这个题目非常的简单,我们可能会利用循环思想先打印左旋k个字符之后的字符再打印左旋的k的字符。
#include<stdio.h>
#include<string.h>
void Left(char* p, int a,int len)
{
for (int i = a; i < len; i++)
printf("%c", *(p + i));
for (int i = 0; i < a; i++)
printf("%c", *(p + i));
}
int main()
{
char ch[50] = { 0 };
gets_s(ch);
int lenth = strlen(ch);
int b = 0;
printf("可以左旋字符串中的几个字符:");
scanf("%d",&b);
b%=lenth;//长度为5时可能旋转6次也就是旋转1次
Left(ch,b,lenth);
return 0;
}
但小编想说这样子想是可以将题目写出来,但小编想为各位友友提供其他方法。
1.设计循环是字符串左旋一次,执行k次。
首先写出函数主体
#include<stdio.h>
int main()
{
char ch[50]={0};//对字符串初始化
gets_s(ch);
int lenth = strlen(ch);
int b = 0;
printf("可以左旋字符串中的几个字符:");
scanf("%d",&b);
b%=lenth;
Left(ch,b,lenth);
return 0;
}
其次再来写左旋函数
void Left(char* p, int n, int lenth)
{
for(int i=0;i<n;i++)//循环左旋k次
{
char tem = p[0];
int j = 0;
for (j = 0; j < lenth-1;j++)//左旋一次
{
p[j] = p[j + 1];
}
p[j] = tem;//循环结束后j++(j的值增加了1),所以千万别写成了p[j+1]=tem;
}
}
2.利用字符库函数进行拼接
主体函数一样但以为要利用字符库函数进行拼接,所以要包含头文件#inlude<string.h>(友友们不要忘记了哦)
void Left(char* p, int n, int lenth)
{
char tem[50] = { 0 };
strcpy(tem, p + n);//先将后面的全部拷贝过来
strncat(tem, p, n);//后将前面的连接在tem后面
strcpy(p, tem);//再将tem里面的拷贝
}
3.分成三段进行左旋
//例如 ABCDEFG ,左旋3次后变成 DEFGABC, 有一个特殊的操作方式:
//先将要左旋的前三个家伙逆序( CBADEFG ),然后将后半段也逆序(CBAGFED),最后整体逆序( DEFGABC )即可。这样只需要做数值交换即可,可以写一个函数帮我们完成局部逆序,代码如下:
#include<stdio.h>
#include<string.h>
void reverse_part(char* p, int start, int end) //将字符串从 start 到 end 这一段逆序
{
int i, j;
char tmp;
for (i = start, j = end; i < j; i++,j--)
{
tmp = p[i];
p[i] = p[j];
p[j] = tmp;
}
}
void leftRound(char* p , int time)
{
int lenth = strlen(p);
int pos = time % lenth;
reverse_part(p, 0, pos - 1); //逆序前段
reverse_part(p,pos, lenth - 1);//逆序后段
reverse_part(p, 0, lenth - 1);//整体逆序
}
函数主体小编未给,小编懒惰虫上头了,下线了,希望各位友友能有所收获!!!