模拟算法(3)_Z字形变换
个人主页:C++忠实粉丝
欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 C++忠实粉丝 原创模拟算法(3)_Z字形变换
收录于专栏【经典算法练习】
本专栏旨在分享学习算法的一点学习笔记,欢迎大家在评论区交流讨论💌
目录
1. 题目链接 :
2. 题目描述 :
3. 解法(模拟) :
解法一(模拟 + 暴力):
题目分析 :
算法思路 :
示例展示:
代码展示 :
结果分析 :
解法二(模拟 + 规律) :
算法思路:
代码展示:
结果分析:
1. 题目链接 :
OJ链接 : Z字形变换
2. 题目描述 :
将一个给定字符串 s 根据给定的行数 numRows ,以从上往下、从左到右进行 Z 字形排列。
比如输入字符串为 "PAYPALISHIRING" 行数为 3 时,排列如下:
P A H N A P L S I I G Y I R
之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:"PAHNAPLSIIGYIR"。
请你实现这个将字符串进行指定行数变换的函数:
string convert(string s, int numRows);
示例 1:
输入:s = "PAYPALISHIRING", numRows = 3 输出:"PAHNAPLSIIGYIR"
示例 2:
输入:s = "PAYPALISHIRING", numRows = 4 输出:"PINALSIGYAHRPI" 解释: P I N A L S I G Y A H R P I
示例 3:
输入:s = "A", numRows = 1 输出:"A"
提示:
1 <= s.length <= 1000s由英文字母(小写和大写)、','和'.'组成1 <= numRows <= 1000
3. 解法(模拟) :
解法一(模拟 + 暴力):
题目分析 :
假如题目给我们这样的字符串s : a. b. c. d. e. f. g. h. i. j. k. l. m. n numRows = 4
从上往下进行Z字形排列,然后从左往右逐行读取,产生出一个新的字符串: agmbfhlnceikdj
如下图所示:

算法思路 :
1. 输入判断:
首先,算法检查 numRows 是否小于等于 1 或大于等于字符串 s 的长度。如果是,则直接返回原字符串 s,因为在这些情况下,不需要进行任何转换。
2. 初始化:创建一个字符串向量 rows 来存储每一行的内容。这个向量的大小是 min(numRows, (int)s.size()),以防字符串长度小于行数。
curRow 用于跟踪当前字符应该放入的行,初始值为 0。
goingDown 是一个布尔值,用于指示当前的遍历方向(向下或向上)。
3. 遍历字符串:使用一个循环遍历字符串 s 中的每个字符。
将当前字符 ch 添加到对应的行 rows[curRow]。
判断是否到达了第一行(curRow == 0)或最后一行(curRow == numRows - 1)。如果到达了这些边界,就反转方向,即将 goingDown 的值取反。
根据当前方向更新 curRow 的值。如果 goingDown 为 true,则 curRow 加 1;否则减 1。
4. 组合结果:最后,创建一个字符串 ret,将 rows 向量中的所有行连接在一起,形成最终结果。
示例展示:
假设输入字符串 s = "PAYPALISHIRING",并且 numRows = 3,算法的执行步骤如下:
初始化:
rows = ["", "", ""](三个空字符串)
curRow = 0
goingDown = false
遍历字符:
添加 P → rows = ["P", "", ""], curRow = 1
添加 A → rows = ["P", "A", ""], curRow = 2
添加 Y → rows = ["P", "A", "Y"], curRow = 1
添加 P → rows = ["P", "AP", "Y"], curRow = 0
添加 A → rows = ["PA", "AP", "Y"], curRow = 1
添加 L → rows = ["PA", "AP", "YL"], curRow = 2
添加 I → rows = ["PA", "API", "YL"], curRow = 1
添加 S → rows = ["PA", "APIS", "YL"], curRow = 0
添加 H → rows = ["PAH", "APIS", "YL"], curRow = 1
添加 I → rows = ["PAH", "APISI", "YL"], curRow = 2
添加 R → rows = ["PAH", "APISIR", "YL"], curRow = 1
添加 I → rows = ["PAH", "APISIRI", "YL"], curRow = 0
添加 N → rows = ["PAHN", "APISIRI", "YL"], curRow = 1
添加 G → rows = ["PAHN", "APISIRIG", "YL"], curRow = 2
代码展示 :
class Solution {
public:string convert(string s, int numRows) {//如果行数小于等于或大于等于字符串长度,直接返回原字符串if(numRows <= 1 || numRows >= s.size()) return s;//创建一个字符串向量来存储每一行vector<string> rows(min(numRows, (int)s.size()));int curRow = 0; //当前索引bool goingDown = false;//方向标志,false表示向上,true表示向下//遍历字符串中的每个字符for(char ch : s){rows[curRow] += ch;//将字符添加到当前行//当到达第一行或最后一行时,改变方向if(curRow == 0 || curRow == numRows - 1) goingDown = !goingDown;//切换方向//更新当前索引curRow += goingDown ? 1 : -1;}//组合所有行string ret;for(auto ch : rows)ret += ch;return ret;}
};

结果分析 :
时间复杂度
该算法的时间复杂度是 O(n),其中 n 是输入字符串的长度,因为每个字符都会被遍历一次。
空间复杂度
空间复杂度是 O(n),用于存储结果行数和结果字符串。
解法二(模拟 + 规律) :
算法思路:
不难发现,数据是以 2row - 2 为⼀个周期进⾏规律变换的。将所有数替换成用周期来表示的变量:
第⼀行的数是:0, 2row - 2, 4row - 4;
第⼆行的数是:1, (2row - 2) - 1, (2row - 2) + 1, (4row - 4) - 1, (4row - 4) + 1;
第三行的数是:2, (2row - 2) - 2, (2row - 2) + 2, (4row - 4) - 2, (4row - 4) + 2;
第四行的数是:3, (2row - 2) + 3, (4row - 4) + 3。
可以观察到,第⼀行、第四行为差为 2row - 2 的等差数列;第二行、第三行除了第⼀个数取值为行
数,每组下标为(2n - 1, 2n)的数围绕(2row - 2)的倍数左右取值。
以此规律,我们可以写出迭代算法。
再进一步抽象成序号:
代码展示:
class Solution {
public:string convert(string s, int numRows) {string ret;if(numRows <= 1 || numRows >= s.size()) return s;//求出公差int d = 2 * numRows - 2;//处理第一行for(int i = 0; i < s.size(); i += d)ret += s[i];//处理中间k行for(int i = 1; i < numRows - 1; i++)for(int j = i; j < s.size(); j += d){ret += s[j];if(j + d - 2 * i < s.size()) ret += s[j + d - 2 * i]; }//处理最后一行for(int i = numRows - 1; i < s.size(); i += d)ret += s[i];return ret;}
};
结果分析:
综合
时间复杂度 : O(n)
空间复杂度 : O(n)
相关文章:
模拟算法(3)_Z字形变换
个人主页:C忠实粉丝 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 C忠实粉丝 原创 模拟算法(3)_Z字形变换 收录于专栏【经典算法练习】 本专栏旨在分享学习算法的一点学习笔记,欢迎大家在评论区交流讨论💌 目录 1. 题目链…...
Go语言实现长连接并发框架 - 任务执行流路由模块
文章目录 前言接口结构体接口实现项目地址最后 前言 你好,我是醉墨居士,上篇博客中我们实现了任务执行流上下文部分,接下来我们实现一下任务执行流的路由模块,基于该模块可以实现将消息转发到相应注册的任务执行流中进行处理 接…...
Windows 编译 FFmpeg 源码详细教程
FFmpeg FFmpeg 是一个开源的多媒体框架,它包括了一整套工具和库,可以用来处理(转码、转换、录制、流式传输等)音频和视频。FFmpeg 支持广泛的音视频格式,并且可以在多种操作系统上运行,包括 Windows、Linux 和 macOS。 FFmpeg 的主要组件包括: ffmpeg:这是一个命令行工…...
JavaCV 实现视频链接截取封面工具
引入必要依赖 <!--JavaCV--> <dependency><groupId>org.bytedeco</groupId><artifactId>javacv-platform</artifactId><version>1.5.7</version> </dependency> <dependency><groupId>cn.hutool</groupI…...
初识Linux · 进程替换
目录 前言: 1 直接看代码和现象 2 解释原理 3 将代码改成多进程版本 4 认识所有函数并使用 前言: 由前面的章节学习,我们已经了解了进程状态,进程终止以及进程等待,今天,我们学习进程替换。进程替换我…...
项目-坦克大战学习-人机ai
我们要知道,人机的移动和玩家的移动方式是一样的,所以我们可以将玩家移动代码以及检测碰撞代码移过来,唯一不同的就是人机检测到碰撞后会改变方向继续移动而不是停止 所以我们需要一个随机数使人机检测到碰撞后随机修改方向 Random rd new …...
YOLOv11改进 | Conv篇 | YOLOv11引入SKConv
1. SKConv介绍 1.1 摘要:在标准卷积神经网络(CNN)中,每层中阿尔蒂神经元的感受野被设计为共享相同的大小。在神经科学界众所周知,视觉皮层神经元的感受野大小受到刺激的调制,这在构建CNN时很少考虑。我们在CNN中提出了一种动态选择机制,允许每个神经元根据输入信息的多…...
招联2025校招内推
【投递方式】 直接扫下方二维码,或点击内推官网https://wecruit.hotjob.cn/SU61025e262f9d247b98e0a2c2/mc/position/campus,使用内推码 igcefb 投递) 【招聘岗位】 后台开发 前端开发 数据开发 数据运营 算法开发 技术运维 软件测试 产品策…...
美容院管理创新:SpringBoot系统设计与开发
摘 要 如今的信息时代,对信息的共享性,信息的流通性有着较高要求,因此传统管理方式就不适合。为了让美容院信息的管理模式进行升级,也为了更好的维护美容院信息,美容院管理系统的开发运用就显得很有必要。并且通过开发…...
文心一言 VS 讯飞星火 VS chatgpt (361)-- 算法导论24.3 3题
三、假定将 Dijkstra 算法的第4行改为: 4 while |Q|>1 这种改变将让 while 循环的执行次数从 ∣ V ∣ |V| ∣V∣ 次降低到 ∣ V ∣ − 1 |V|-1 ∣V∣−1 次。这样修改后的算法正确吗? 如果要写代码,请用go语言。 文心一言: 将 Dijkst…...
ArkTS 开发中,有两种网络请求
在鸿蒙开发中,ArkTS(Ark TypeScript)是用于构建鸿蒙应用的一种开发语言,它基于TypeScript,并提供了丰富的API和工具集来简化开发过程。其中,网络请求是开发应用时经常需要用到的一个功能。 ArkTS 网络请求…...
记录一次病毒启动脚本
在第一次下载软件时,目录中配了一个使用说明,说是需要通过start.bat 这个文件来启动程序,而这个 start.bat 就是始作俑者: 病毒作者比较狡猾,其中start.bat 用记事本打开是乱码,但是可以通过将这个批处理…...
2019~2023博文汇总目录
2023 大厂实践 - 哈啰:记录一次ElasticSearch的查询性能优化-CSDN博客 Shiro安全框架-CSDN博客 MQ知识点汇总-CSDN博客 工作学习记录-CSDN博客 后端架构师技术图谱-CSDN博客 2020 Elasticsearch相关技术点_elasticsearch技术点-CSDN博客 Kafka相关技术点_kafka…...
springboot项目配置部分依赖从私服拉取,部分从阿里云拉取
在Java项目中,配置部分依赖从私服拉取,部分从阿里云拉取,可以在Maven的配置文件settings.xml中设置多个镜像,Maven会根据镜像的顺序尝试下载依赖。 配置私服镜像:首先配置你的私服镜像,例如Nexus私服&…...
返回索引对象中各元素的数据类型 pandas.Index.dtype
【小白从小学Python、C、Java】 【考研初试复试毕业设计】 【Python基础AI数据分析】 返回索引对象中 各元素的数据类型 pandas.Index.dtype [太阳]选择题 根据题目代码,执行idx3.dtype的结果是? import pandas as pd idx1 pd.Index([1, 2, 3, 4, 5])…...
通过freepbx搭建小型电话系统的过程
领导说公司的客服电话需要实现语音导航和非工作时间自动接听播放语音提示的功能。任务自然落到了伟大的程序员的头上,本着为公司节约成本原则遂百度了一番,找到了asterisk 和freeswitch两个比较流行的电话系统。经过对比和考虑公司的情况选择了asterisk系…...
pdf处理1
处理PDF文件以构建数据索引是一个复杂但关键的步骤,尤其是因为PDF格式的文件通常包含多种元素,如文本、图片、表格、标题等。以下是一个通俗易懂的详细解释,帮助你理解PDF文件是如何被处理和解析的: 1. PDF文件的基本结构 PDF&a…...
区间覆盖(贪心)
给定 NN 个闭区间 [ai,bi][ai,bi] 以及一个线段区间 [s,t][s,t],请你选择尽量少的区间,将指定线段区间完全覆盖。 输出最少区间数,如果无法完全覆盖则输出 −1−1。 输入格式 第一行包含两个整数 ss 和 tt,表示给定线段区间的两…...
[rk3588 debain]cpu死锁问题解决
1 问题 rk3588机器上运行客户如下程序程序发生“BUG: spinlock recursion on CPU#0” ./rtsp RtspWrapper.xml 应用程序功能是:ip摄像头推流,通过rtsp协议拉流,对视频流做裁剪,缩放工作。首先,根据视频帧率每秒钟处理…...
CMU 10423 Generative AI:lec18(大模型的分布式训练)
这个文档主要讲解了分布式训练(Distributed Training),特别是如何在多GPU上训练大规模的语言模型。以下是主要内容的概述: 1. 问题背景 训练大规模语言模型的主要挑战是内存消耗。 训练过程中,内存消耗主要来源于两个…...
SEO网站广告如何与本地化营销相结合
SEO网站广告与本地化营销的结合:如何提升本地企业的市场竞争力 在当今数字化经济的浪潮中,SEO网站广告和本地化营销已经成为企业营销的两大重要手段。如何将这两者有机地结合,以实现最大的营销效益,是许多企业面临的重要课题。本…...
从Java全栈工程师视角看Web开发的实战与思考
从Java全栈工程师视角看Web开发的实战与思考 面试现场:一次真实的技术对话 面试官:你好,我是今天的面试官,很高兴见到你。请先简单介绍一下自己。 应聘者:你好,我叫李明,28岁,本科学…...
终极免费指南:让macOS视频预览功能瞬间强大的秘密武器
终极免费指南:让macOS视频预览功能瞬间强大的秘密武器 【免费下载链接】QuickLookVideo This package allows macOS Finder to display thumbnails, static QuickLook previews, cover art and metadata for most types of video files. 项目地址: https://gitcod…...
2025最权威的降AI率网站实际效果
Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 有的技术方案,其旨在减低文本人工智能生成特征,这就是降AIGC工具。它…...
技术洞察:zyfun如何重构跨平台视频播放体验
技术洞察:zyfun如何重构跨平台视频播放体验 【免费下载链接】zyfun 跨平台桌面端视频资源播放器,免费高颜值. 项目地址: https://gitcode.com/gh_mirrors/zy/zyfun 在数字娱乐快速发展的今天,跨平台视频播放器面临着系统兼容性、性能优化和用户体…...
基于MATLAB的用于分析弧齿锥齿轮啮合轨迹的程序已调通,可直接运行并输出齿轮啮合轨迹及传递误差
158.基于matlab的用于分析弧齿锥齿轮啮合轨迹的输出齿轮啮合轨迹及传递误差程序已调通,可直接运行 1. 程序概述 本程序包实现了一套完整的弧齿锥齿轮齿面接触分析(TCA) 系统,主要用于分析大轮凸面与小轮凹面的啮合特性。程序由刘…...
机器学习在医疗诊断中的应用
机器学习在医疗诊断中的应用 【免费下载链接】Zettlr Your One-Stop Publication Workbench 项目地址: https://gitcode.com/GitHub_Trending/ze/Zettlr 背景 [[医疗诊断现状分析]]显示当前诊断方法的局限性。 方法 基于[[机器学习基础概念]]中的监督学习方法。 应用…...
基于S7-200 PLC和MCGS组态的灌装贴标生产线系统:带解释的梯形图程序、接线图原理图图...
基于S7-200 PLC和MCGS组态的灌装贴标生产线系统 带解释的梯形图接线图原理图图纸,io分配,组态画面车间里那台老灌装线最近被我折腾得焕然一新,用S7-200 PLC搭配MCGS组态搞了个自动化改造。这活儿干下来发现几个关键点特别有意思,尤…...
别再用默认字典了!DVWA暴力破解实战:从Low到High,手把手教你配置Burp Suite的Pitchfork模式
别再用默认字典了!DVWA暴力破解实战:从Low到High,手把手教你配置Burp Suite的Pitchfork模式 在渗透测试的入门阶段,暴力破解往往是最先接触的攻击手段之一。但许多新手在DVWA的High级别面前束手无策——那些看似简单的登录表单&am…...
无损视频剪辑效率全攻略:5分钟掌握革新性剪辑技术
无损视频剪辑效率全攻略:5分钟掌握革新性剪辑技术 【免费下载链接】lossless-cut The swiss army knife of lossless video/audio editing 项目地址: https://gitcode.com/gh_mirrors/lo/lossless-cut 你是否曾因视频剪辑软件的漫长渲染过程而错失发布良机&a…...
