返回

关于字符串旋转的三种解法(入门题型)

发布时间:2022-09-22 10:34:00 347

前言

大家请看这道题,是需要自己实现字符串旋转,旋转几个字符自己指定,这个算是比较基础的题型吧,我这里有三种解法,接下来的通过画图和代码先进行第一种解法的讲解,题目如下图: image.png 大家可以看到,字符ABCD经过了一次旋转变成了BCDA 如图所示: image.png 这个是第一种解法的大概过程,接下来给大家讲解如何实践字符串的交换:

#include
//字符串字符旋转
#include
void bubbling(char*arr,int sz,int n)
{
	assert(arr);
	int i = 0;
	int j = 0;
	for (i = 0; i < n; i++)
	{
		char tmp = 0;
		for (j = 0; j < sz-1;j++)
		{
			tmp = arr[j];
			arr[j] = arr[j + 1];
			arr[j + 1] = tmp;
		} 
	}
}
void print(char*arr)
{
	printf("%s \n", arr);
}
int main()
{
	char arr[] = "abcd";
	int sz = sizeof(arr) / sizeof(arr[0])-1;
	int n = 0;
	printf("请输入要交换的次数\n");
	while (~scanf("%d", &n))
	{
		bubbling(arr, sz, n);//用冒泡交换来实现字符旋转
		print(arr);
		printf("请输入要交换的次数\n");
	}
return 0;
}

这个是我写的一个交换的代码,是由数组进行交换的大家可以看一下,下面为大家解析如何用数组一个一个交换,其实原理和冒泡排序一样,就是一个外循环,一个内循环,外循环负责控制旋转的字节的数量,如果我们的n输入1,那就是旋转一次,如果是2,就是旋转2次,接下来给大家讲解内循环, image.png 大家可以看见我们的arr[0]先和arr[1]交换,其次是arr[1]和arr[2]交换如此往复,大家就会想到冒泡排序也是一个一个进行交换,但是冒泡排序比这个多了个判定条件,假如是升序,就只能第一个比第二个元素大的时候交换,但是这个不用,只需要完成交换就可以,如图: image.png 这里的第一个参数是字符串首元素的地址,第二个参数是字符串中字符的个数(不包含/0),第三个参数也就是我们自己输入的要旋转字符的个数,image.png 大家可以看到紫色框框是外循环,用来进行交换几个字符的判断,内循环是红色框框,我们设置了一个变量tmp用它去接收我们arr[j]的值,然后我们再将arr[j]的值变成arr[j+1]的值,就这样循环交换,因为我们有4个字符,我们就需要交换三次,如图所示image.png 所以我们的判断条件就是sz-1,(我们在求字符串大小的时候注意sizeof(arr)会把'\0'也计算再内,所以我们算到最后要进行-1操作,这样我们的sz才是我们的字符数)因为sz-1就是咱们以本图为准,当我有4个字符数时,我们就需要交换3次,因为j从0开始,所以当j=2时正好是0,1,2交换了三次,于是就得到了: image.png 当我输入1是旋转一次,成为了如图所示的字符串,当然我在前面也讲过,控制字符交换的个数用n来进行,如果n为2就是交换两个字符如图: image.png 大家可以看到ab旋转到了后面由abcd变成了cdab 好了这大概就是第一种解法的讲解了,接下来我在后续还会补充第二种写法,第二种写法我个人比较推荐,那这次就到这里了,大家可以点个赞,就当对新人的支持啦!!! 谢谢大家!!!

特别声明:以上内容(图片及文字)均为互联网收集或者用户上传发布,本站仅提供信息存储服务!如有侵权或有涉及法律问题请联系我们。
举报
评论区(0)
按点赞数排序
用户头像
精选文章
thumb 中国研究员首次曝光美国国安局顶级后门—“方程式组织”
thumb 俄乌线上战争,网络攻击弥漫着数字硝烟
thumb 从网络安全角度了解俄罗斯入侵乌克兰的相关事件时间线