字符串左旋的三种解法

✨✨小新课堂开课了,欢迎欢迎~✨✨

🎈🎈养成好习惯,先赞后看哦~🎈🎈

所属专栏: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;
}


解法二:库函数法

介绍这个用法前我们先了解两个库函数,strcpystrncat(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;
}

三种解法到这里就结束了,希望大家看完都有所收获,我们一起进步。

  • 12
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值