✨✨小新课堂开课了,欢迎欢迎~✨✨
🎈🎈养成好习惯,先赞后看哦~🎈🎈
所属专栏:http://t.csdnimg.cn/BZgNf(C语言习题)
http://t.csdnimg.cn/Oytke (C语言)
小新的主页:编程版小新-CSDN博客
题目:
实现一个函数,可以左旋字符串中的k个字符
例如:
ABCD左旋一个字符得到BCDA
ABCD左旋两个字符得到CDAB
解法一:常规解法
第一种解法的基本思路就是我们可以把左旋拆分为两个过程,第一个过程控制左旋的次数,第二个过程进行左旋的内部操作。进行内部操作时第一个字符的左旋我们可以创建一个临时变量来解决,其余的的字符依此向左移动,留出最后一个位置把第一个字符放进去即可。
用代码实现就是:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
void LeftFound(char *str, int k)
{
int len = strlen(str);
int time = k % len;//左旋的次数
for (int i = 0; i < time; i++)//控制左旋的次数
{
char tmp = str[0];
int j = 0;
for (j = 0; j < len - 1; j++)//左旋的内部操作
{
str[j] = str[j + 1];
}
//出来的时候j已经是3了
str[j] = tmp;
}
}
int main()
{
char str[] = "ABCD";
int k = 0;
scanf("%d", &k);
LeftFound(str, k);
printf("%s", str);
return 0;
}
解法二:库函数法
介绍这个用法前我们先了解两个库函数,strcpy和strncat(strcat)。
strcpy:字符串拷贝
strncat:字符串拼接
下面我给大家举个例子,方便理解咯~
int main()
{
char str1[200] = { 0 };
char str2[] = "abcd";
strcpy(str1, str2);//把str2中的字符串拷贝到str1中去
printf("%s\n", str1);
printf("%s\n", str2);
return 0;
}
运行的结果:
接下来我们看strcat
int main()
{
char str1[200] ="hello";
char str2[] = "abcd";
strcat(str1, str2);//注意这里是strcat,这里的作用是把str2中的字符串都拼接到str1中去
//strncat(st1, str2, 2);//strncat是控制把str2中的前两个字符拼接过去
printf("%s", str1);
return 0;
}
运行结果:
strncat:
int main()
{
char str1[200] ="hello";
char str2[] = "abcd";
//strcat(str1, str2);//注意这里是strcat,这里的作用是把str2中的字符串都拼接到str1中去
strncat(str1, str2, 2);//strncat是控制把str2中的前两个字符拼接过去
printf("%s", str1);
return 0;
}
运行结果:
接下来看整体的代码:
oid LeftFound(char* str, int k)
{
int len = strlen(str);
int time = k % len;//左旋的次数 2
char tmp[200] = { 0 };
strcpy(tmp, str + time);//CD
strncat(tmp, str, time);//AB
strcpy(str, tmp);//CDAB
}
int main()
{
char str[] = "ABCD";
int k = 0;
scanf("%d", &k);
LeftFound(str, k);
printf("%s", str);
return 0;
}
方法三:三次逆序法
假设我们要左旋两次,把ABCD拆分为两个部分,第一个部分为两个字符,第二个部分为后两个字符。第一次逆序为第一个部分的字符逆序,第二次逆序为第二个部分的字符逆序,两次逆序的结果作为一个整体在逆序一次,这为最后一次逆序,三次逆序下来就能得到想要的结果。
接下来我们看整体的代码
void ReverseRange(char* str, int start, int end)
{
int left = start;
int right = end;
int tmp = 0;
while (left < right)
{
tmp = str[left];
str[left] = str[right];
str[right] = tmp;
left++;
right--;
}
}
void LeftFound(char* str, int k)
{
int len = strlen(str);
int time = k % len;//左旋的次数
ReverseRange( str, 0, time - 1);
ReverseRange(str, time, len-1);
ReverseRange(str, 0, len - 1);
}
int main()
{
char str[] = "ABCD";
int k = 0;
scanf("%d", &k);
LeftFound(str, k);
printf("%s", str);
return 0;
}
三种解法到这里就结束了,希望大家看完都有所收获,我们一起进步。