当前位置: 首页 > news >正文

Python面试宝典第17题:Z字形变换

题目

        将一个给定字符串 s 根据给定的行数numRows ,以从上往下、从左到右进行Z字形排列。比如:输入字符串为"PAYPALISHIRING",行数为3时,排列如下。最后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:"PAHNAPLSIIGYIR"。

P   A   H   N
A P L S I I G
Y   I   R

        示例 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"

模拟生成法

        模拟生成法通过直接模拟Z字形路径的构建过程来求解,其基本思路为:创建一个二维数组来存储每行的字符,根据Z字形的移动规律填充字符。对于每一列,从上到下再从下到上交替填充字符,直到所有字符都被放置。最后,将二维数组的内容依次连接成一个字符串。使用模拟生成法求解本题的主要步骤如下。

        1、初始化。创建一个二维列表,大小为numRows行,用于存储Z字形排列的每个字符。同时,初始化行索引 row为0,方向变量goingDown为True表示当前正向下移动,False表示向上移动。

        2、遍历字符串。对于输入字符串 s 中的每个字符,根据当前的行索引row将字符放入二维列表的对应位置。

        3、更新行索引和方向。根据当前的移动方向更新行索引,如果到达第一行或最后一行,则改变移动方向。

        4、构造结果字符串。最后,遍历二维列表,将所有字符按顺序连接成一个字符串并返回。

        根据上面的算法步骤,我们可以得出下面的示例代码。

def zigzag_conversion_by_simulation(s: str, numRows: int) -> str:if numRows == 1 or numRows >= len(s):# 特殊情况处理:只有一行,或行数大于等于字符串长度时,直接返回原字符串return s# 初始化二维列表rows = [''] * numRowsrow = 0goingDown = Truefor char in s:# 在当前行添加字符rows[row] += charif goingDown:# 增加行索引row += 1# 到达最后一行,准备向上if row == numRows - 1:goingDown = Falseelse:# 减少行索引row -= 1# 回到第一行,准备向下if row == 0:goingDown = Truereturn ''.join(rows)print(zigzag_conversion_by_simulation('PAYPALISHIRING', 3))
print(zigzag_conversion_by_simulation('PAYPALISHIRING', 4))
print(zigzag_conversion_by_simulation('A', 1))

一次遍历法

        通过观察Z字形排列的规律,可以发现字符串中的字符实际上是以一定的周期性“跳跃”到下一行或上一行。我们可以直接通过计算确定每个字符应该落在哪一行,而不需要实际创建二维数组。使用一次遍历法求解本题的主要步骤如下。

        1、计算周期。首先,识别Z字形排列的周期性。对于每一组完整的“向下-向上”往返,涉及2*numRows - 2个字符。另外,还需考虑边界情况,即当行数为1或字符串长度不足以形成完整周期的场景。

        2、遍历并直接构建结果。通过计算当前字符在Z字形中的实际行位置,直接在结果字符串中构建输出。利用数学公式确定字符应落在哪一行,依据当前字符索引和Z字形的行数动态调整。

def zigzag_conversion_by_traversal(s: str, numRows: int) -> str:if numRows == 1 or numRows >= len(s):# 特殊情况处理:只有一行,或行数大于等于字符串长度时,直接返回原字符串return sresult = [''] * numRowsn = len(s)# 完整周期字符数cycle = 2 * numRows - 2for i in range(n):# 计算当前字符在Z字形中的行位置,在每个周期内,字符在前numRows-1行是递增,之后是递减row_index = i % cycle if i % cycle < numRows else cycle - i % cycle# 将字符添加到对应行result[row_index] += s[i]# 将结果列表中的字符串合并为一个字符串return ''.join(result)print(zigzag_conversion_by_traversal('PAYPALISHIRING', 3))
print(zigzag_conversion_by_traversal('PAYPALISHIRING', 4))
print(zigzag_conversion_by_traversal('A', 1))

总结

        模拟生成法的时间复杂度为O(n),其中n是输入字符串的长度。空间复杂度为O(numRows * m),其中m是字符串s中最长行的字符数。最坏情况下,如果numRows较大且字符串分布均匀,可能需要较大的空间来存储二维数组。模拟生成法直接反映了Z字形的实际构建过程,逻辑清晰,实现直观,易于理解和编码。缺点在于空间效率较低,当numRows很大时,可能会占用较多的空间。

        一次遍历法的时间复杂度也为O(n),空间复杂度为O(numRows),只需一个大小为numRows的列表来暂存每行的字符。相比模拟法,空间需求更低,特别是当字符串很长而numRows较小时。缺点在于实现相对抽象,理解其背后的数学逻辑可能需要更多的思考。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 微信小程序面试题汇总
  • 后端存储流程结构的思考
  • 微服务分布式事务
  • ipsec协议簇(详解)
  • 学懂C语言(十三):C语言中判断与循环的用法
  • 云监控(华为) | 实训学习day6(10)
  • 【华为机考真题】字符串压缩
  • 汽车技术智能化程度不断提升,线束可靠性如何设计?
  • 笔记 3 : 继续彭老师课本第 3 章的 arm 的汇编指令
  • lua 游戏架构 之 LoaderWallet 异步加载
  • 在python中使用正则表达式
  • 微服务和VUE入门教程(16): zuul 熔断
  • JMeter使用手册
  • Redis集群部署Windows版本
  • EXCEL怎么自动添加表格吗?
  • 【Redis学习笔记】2018-06-28 redis命令源码学习1
  • 【跃迁之路】【733天】程序员高效学习方法论探索系列(实验阶段490-2019.2.23)...
  • CSS中外联样式表代表的含义
  • iOS编译提示和导航提示
  • Java深入 - 深入理解Java集合
  • Java新版本的开发已正式进入轨道,版本号18.3
  • JSDuck 与 AngularJS 融合技巧
  • 爱情 北京女病人
  • 关于extract.autodesk.io的一些说明
  • 入手阿里云新服务器的部署NODE
  • 时间复杂度与空间复杂度分析
  • 数据可视化之 Sankey 桑基图的实现
  • 王永庆:技术创新改变教育未来
  • 在 Chrome DevTools 中调试 JavaScript 入门
  • k8s使用glusterfs实现动态持久化存储
  • puppet连载22:define用法
  • 继 XDL 之后,阿里妈妈开源大规模分布式图表征学习框架 Euler ...
  • (10)Linux冯诺依曼结构操作系统的再次理解
  • (3)选择元素——(14)接触DOM元素(Accessing DOM elements)
  • (day 12)JavaScript学习笔记(数组3)
  • (Redis使用系列) Springboot 整合Redisson 实现分布式锁 七
  • (zhuan) 一些RL的文献(及笔记)
  • (二十三)Flask之高频面试点
  • (六)库存超卖案例实战——使用mysql分布式锁解决“超卖”问题
  • (牛客腾讯思维编程题)编码编码分组打印下标(java 版本+ C版本)
  • (提供数据集下载)基于大语言模型LangChain与ChatGLM3-6B本地知识库调优:数据集优化、参数调整、Prompt提示词优化实战
  • (五) 一起学 Unix 环境高级编程 (APUE) 之 进程环境
  • (续)使用Django搭建一个完整的项目(Centos7+Nginx)
  • (一)Spring Cloud 直击微服务作用、架构应用、hystrix降级
  • (转)大型网站的系统架构
  • ./configure、make、make install 命令
  • .cfg\.dat\.mak(持续补充)
  • .net 4.0发布后不能正常显示图片问题
  • .NET 8 中引入新的 IHostedLifecycleService 接口 实现定时任务
  • .net core webapi 大文件上传到wwwroot文件夹
  • .net core 调用c dll_用C++生成一个简单的DLL文件VS2008
  • .NET WebClient 类下载部分文件会错误?可能是解压缩的锅
  • .NET 服务 ServiceController
  • .NET 漏洞分析 | 某ERP系统存在SQL注入
  • .netcore 6.0/7.0项目迁移至.netcore 8.0 注意事项