一篇文章搞定字符串的旋转问题(数组旋转问题)!

news2024/11/21 1:45:17

目录

前言

一.如何实现字符串的旋转?

1.用冒泡的思想实现

2.分别逆序左右再整体逆序来实现

二.如何快速判断一个字符串是否为另外一个字符串旋转之后的字符串?

1.相关库函数的简略学习

2.利用库函数快速实现判断

总结


博客主页:张栩睿的博客主页

欢迎关注:点赞+收藏+留言

系列专栏:c语言学习

        家人们写博客真的很花时间的,你们的点赞和关注对我真的很重要,希望各位路过的朋友们能多多点赞并关注我,我会随时互关的,欢迎你们的私信提问,也期待你们的转发!

        希望大家关注我,你们将会看到更多精彩的内容!!!

前言

        家人们在刷题的时候也许会碰到旋转数组的问题,这篇文章就来彻底教会你字符串的旋转!

一.如何实现字符串的旋转?

        我们先来看看这道题目:

题目要求我们实现字符串的旋转,这个时候我们会想到我们之前学的排序:冒泡排序。

1.用冒泡的思想实现

        对于左旋转的题型,我们可以将第一个元素取出来,让后面的元素依次冒泡向前移动,最后将第一个元素放到最后去,这就实现了一次旋转,我们在通过循环就可以实现字符串的旋转。对于右旋转问题,改变方向即可。代码实现如下:

方法一:
void left_move(char arr[], int k)
{
	int len = strlen(arr);
	k %= len;
	int j = 0;
	for (int i = 0; i < k; i++)
	{
		char tmp = arr[0];
		for (j = 0; j < len - 1; j++)
		{
			arr[j] = arr[j + 1];
		}
		arr[j] = tmp;
	}
}
int main()
{
	char arr[] = "abcdef";
	int k = 8;
	left_move(arr, k);
	printf("%s\n", arr);
	return 0;
}

        对于这里的k%=len,是因为该字符串最多旋转他本身长度这么多次,超过他的长度次的旋转会导致重复计算,所有我们将取余来去掉重复操作。

2.分别逆序左右再整体逆序来实现

这里有一种奇妙方法来实现逆序,我们来看看图解:

        我们通过旋转的长度,来把字符串分为左右两组,然后让他们分别逆序,在整体逆序就可以实现旋转,大家要注意,这种方法虽然很难理解其中的原因,但是在其他题中也可能会用到,一定要掌握他!代码实现如下:

void reverse(char*left, char* right)
{
	assert(left);
	assert(right);
	while (left < right)
	{
		char tmp = *left;
		*left = *right;
		*right = tmp;
		left++;
		right--;
	}
}
void left_move(char arr[], int k)
{
	int len = strlen(arr);
	k %= len;
	//逆序左
	reverse(arr, arr+k-1);
	//逆序右
	reverse(arr+k, arr + len - 1);
	//逆序整体
	reverse(arr, arr +len-1);
}

二.如何快速判断一个字符串是否为另外一个字符串旋转之后的字符串?

        对于这种判断,我们可以直接无脑的暴力枚举,把逆序的每一种情况与那个字符串相比较来判断,但是这种方法不够简便:

int is_left_move(char arr1[], char arr2[])
{
	int len1 = strlen(arr1);
	int len2 = strlen(arr2);
	if (len1 != len2)
		return 0;
	int i = 0;
	for (i = 0; i < len1; i++)
	{
		left_move(arr1, i);
		if (strcmp(arr1, arr2) == 0)
		{
			return 1;
		}
	}

	return 0;
}

1.相关库函数的简略学习

strncat函数

        该函数的作用是是将两个字符串连接在一起,用法如下:

int main()
{
	char arr[20] = "hello ";
	strncat(arr, "world", 5);
	printf("%s\n", arr);

	return 0;
}

        括号内是将第二个字符串追加到第一个数组中,并保存在该数组中,后面的数字表示第二个字符串存入数组的字符个数。

strstr函数:

        该函数的作用是寻找第二个字符串是否存在于第一个字符串中。

int main()
{
	//是在arr1字符串中查找arr2是否存在
	//如果存在则返回arr2在arr1中的地址
	//如果不存在返回NULL
	char arr1[] = "abcdefabcdef";
	char arr2[] = "def";

	char *ret = strstr(arr1, arr2);
	if (ret == NULL)
	{
		printf("NO\n");
	}
	else
	{
		printf("%s\n", ret);
	}
	return 0;
}

在arr1字符串中查找arr2是否存在
如果存在则返回arr2在arr1中的地址
如果不存在返回NULL 

2.利用库函数快速实现判断

        那么,我们学了这两个函数有什么用呢?其实啊,我们通过循环会发现,如果旋转他的长度那么次,就会得到原字符串,那么我们将该字符串循环一遍,比如abcd变成abcdabcd,你就会惊奇的发现,所有的旋转结果都可以在这个字符串中找到。所以对于旋转字符串,最简洁的方法就是将他重复一遍,在其中寻找旋转字符串。代码实现如下:

int is_left_move(char arr1[], char arr2[])
{
	int len1 = strlen(arr1);
	int len2 = strlen(arr2);
	if (len1 != len2)
		return 0;
	strncat(arr1, arr1, len1);
	if (strstr(arr1, arr2) != NULL)
		return 1;
	else
		return 0;
}
//AABCDAABCD
int main()
{
	char arr1[20] = "AABCD";
	char arr2[] = "ABCDA";
	int ret = is_left_move(arr1, arr2);
	if (ret == 1)
	{
		printf("YES\n");
	}
	else
	{
		printf("NO\n");
	}
	return 0;
}

总结

通过旋转字符串我们又复习了一下循环的使用,之前逆序的写法,还学习了两个库函数。辛苦各位小伙伴们动动小手,三连走一波 最后,本文仍有许多不足之处,欢迎各位认真读完文章的小伙伴们随时私信交流、批评指正!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/159161.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据结构基础知识(一)

1 数据结构的基本概念和算法 考点 数据结构基本概念算法 1.1 数据结构的基本概念 数据 数据是指所有能输入到计算机中的描述客观事物的符号&#xff0c;包括文本、声音、 图像、符号等。 数据元素 数据元素十数据的基本单位&#xff0c;也称节点或记录。 数据项 数据项…

【数仓】FLink+CK

1.项目分层 ODS&#xff1a;原始数据&#xff0c;包含日志和业务数据DWD&#xff1a;根据数据对象为单位进行分流。比如订单、页面访问等。DIM&#xff1a;维度数据DWM&#xff1a;对于部分数据对象进行进一步加工&#xff0c;比如独立访问、跳出行为&#xff0c;也可以和维度…

谷粒商城项目笔记之高级篇(三)

目录1.9.22 提交订单的问题1)、订单号显示、应付金额回显2)、提交订单消息回显3&#xff09;、为了确保锁库存失败后&#xff0c;订单和订单项也能回滚&#xff0c;需要抛出异常1.9.23 创建库存上锁、解锁 业务交换机&队列1&#xff09;、流程梳理2&#xff09;、解锁库存实…

Vsftpd服务的部署及优化详解(图文)

目录 前言 实验环境 一、vsftpd的安装及启用 1、具体步骤 2、开启匿名用户访问功能并测试 二、vsftpd基本信息 三、匿名用户访问控制 四、本地用户访问控制 五、虚拟用户访问 1、建立虚拟用户访问 2、虚拟用户家目录的独立设定 3、用户配置独立 前言 vsftpd是“…

TapTap 算法平台的 Serverless 探索之路

分享人&#xff1a;陈欣昊&#xff0c;TapTap/IEM/AI平台负责人 摘要&#xff1a;本文主要介绍心动网络算法平台在Serverless上的实践。 《TapTap算法平台的 Serverless 探索之路》 Serverless 在构建应用上为我们节省了大量的运维与开发人力&#xff0c;在基本没投入基建人力…

(02)Cartographer源码无死角解析-(49) 2D点云扫描匹配→相关性暴力匹配1:SearchParameters

讲解关于slam一系列文章汇总链接:史上最全slam从零开始&#xff0c;针对于本栏目讲解(02)Cartographer源码无死角解析-链接如下: (02)Cartographer源码无死角解析- (00)目录_最新无死角讲解&#xff1a;https://blog.csdn.net/weixin_43013761/article/details/127350885 文末…

LeetCode分类刷题----链表篇

链表链表1.移除链表元素203.移除链表元素707.设计链表2.反转链表206.反转链表3.两两交换链表中的节点24.两两交换链表中的节点4.删除链表中的倒数第N个节点19.删除链表的倒数第N个节点5.链表相交07.链表相交6.环形链表141.环形链表142.环形链表II链表 1.移除链表元素 203.移除…

成功解决VMware安装操作系统出现分辨率的问题

文章目录问题重现问题原因问题解决方法一&#xff1a;拓展&#xff1a;1. 电脑分辨率&#xff1a;2. xrandr命令3. 查询后如果没有合适的分辨率解决方案参考资料问题重现 如下图&#xff1a; 在VMware16上安装ubuntu操作系统的时候&#xff0c;出现分辨率问题&#xff0c; 导致…

如何录屏有声音?如何录制带声音的视频

平常我们会通过录屏的方式录制电脑画面&#xff0c;然后再保存下来。那您是不是遇到过这种情况&#xff1a;录制的录屏文件只有画面没有声音。没有声音的视频还能修复吗&#xff1f;如何录屏有声音&#xff1f;怎样才能录制带声音的视频&#xff1f;今天小编教大家如何在录屏的…

前端基础(十三)_定时器(间歇定时器、延迟定时器)

定时器 定时器共两种&#xff0c;setInterval及setTimeout&#xff1a; 1、setInterval&#xff1a;重复执行或者叫间歇执行&#xff0c;即隔某个时间就执行一次 2、setTimeout&#xff1a;延迟执行&#xff0c;延迟某个特定的时间开始执行&#xff0c;只执行一次 语法&#x…

代码随想录算法训练营第10天 232.用栈实现队列、225. 用队列实现栈

代码随想录算法训练营第10天 232.用栈实现队列、225. 用队列实现栈 用栈实现队列 力扣题目链接(opens new window) 使用栈实现队列的下列操作&#xff1a; push(x) – 将一个元素放入队列的尾部。 pop() – 从队列首部移除元素。 peek() – 返回队列首部的元素。 empty() –…

十分好用的跨浏览器测试工具,建议收藏!!!

跨浏览器测试是确保web应用程序的功能在不同浏览器、浏览器版本和操作系统直接保持功能和质量一致的过程&#xff0c;可以为用户提供更好的用户体验&#xff0c;帮助企业通过更易访问的网站获得满意客户&#xff0c;可以使web应用程序在不同平台上兼容。在跨浏览器测试过程中&a…

Vulnhub靶机:DIGITALWORLD.LOCAL_ DEVELOPMENT

目录介绍信息收集主机发现主机信息探测网站探测SSH登录lshell绕过sudo提权介绍 系列&#xff1a;digitalworld.local&#xff08;此系列共9台&#xff09; 发布日期&#xff1a;2018 年 12 月 28 日 难度&#xff1a;中级 运行环境&#xff1a;Virtualbox运行失败&#xff0c;…

写作的“收益”超乎想象

十余年写作经验倾囊相授&#xff0c;全面提升你的技术写作能力&#xff01; 前言 技术从业人员普遍比较务实&#xff0c;也就是用心做好分配给自己的任务&#xff0c;努力担负起自己应尽的责任&#xff0c;因为大家都相信&#xff0c;付出必有回报&#xff0c;金字总会闪光。 …

【干货】普通单双面板的生产工艺流程(二)

衔接上文&#xff0c;继续为朋友们分享普通单双面板的生产工艺流程。 如图&#xff0c;第二道主流程为钻孔。 钻孔的目的为&#xff1a; 对PCB进行钻孔&#xff0c;便于后续识别、定位、插件及导通。 目前&#xff0c;行业内主流的PCB钻孔方式为&#xff1a;机械钻孔、激光钻…

引蜘蛛软件哪款有效果?多少钱怎么购买?

引蜘蛛软件哪款有效果?多少钱怎么购买?怎教你查看一个IP地址是不是搜索引擎官方蜘蛛的参考方法#IP地址#官方蜘蛛#搜索引擎官 大家好&#xff0c;今天给大家分享的是关于怎么查看一个 ip 地址是不是搜索引擎官方蜘蛛的参考方法。 很多做网站的小伙伴们肯定会用到这个方式。 有…

用 Python 制作空间数据可视化

大数据时代到来&#xff0c;随着智能设备与物联网技术的普及&#xff0c;人在社会生产活动中会产生大量的数据。在我们的日常活动中&#xff0c;手机会记录下我们到访过的地点&#xff1b;在使用城市公交IC卡、共享单车等服务时&#xff0c;服务供应商会知道这些出行需求产生的…

gdb相关知识

cdir和cwd 当我们用gdb的命令show dir的时候&#xff0c;显示源码搜寻目录&#xff1a; cdir: 代表编译路径&#xff0c;可以打个断点&#xff0c;然后用info source命令查看。 cwd: 代表当下调试的目录&#xff0c;直接用pwd就可以。 添加新的搜索路径 dir /opt/nmt搜索路…

Gemini撕DCG诉感情被骗,灰度百亿大饼持仓却不会爆雷?

插播&#xff1a;《刘教链比特币原理》音频课正在连载中。今天次条是第一章第2节“1-2 比特币的特点和使用”&#xff0c;推荐每一位读者学习。点击此处查看付费合集详情[链接]以及上一课“1-1 五分钟告诉你什么是比特币和区块链”[链接]。* * *比特币今晨突然急速上涨&#xf…

Qt OpenGL(09)在着色器中实现旋转的彩色正方体

文章目录在着色器中实现旋转的彩色正方体旋转矩阵沿x轴旋转&#xff1a;沿y轴旋转&#xff1a;沿z轴旋转&#xff1a;在顶点着色器中实现顶一个vec3的变量 theta计算余弦和正弦值定义3个旋转矩阵最终代码在着色器中实现旋转的彩色正方体 一直觉得用OpenGL 画一个立方体或者彩色…