ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

算法通关手册:LeetCode 0006 Z 字形变换题解(模拟法逐行重构与周期规律)

算法通关手册:LeetCode 0006 Z 字形变换题解(模拟法逐行重构与周期规律) 教程文档知识库【免费下载链接】AlgoNote⛽️「算法通关手册」从零开始的「算法与数据结构」学习教程200 道「算法面试热门题目」1000 道「LeetCode 题目解析」持续更新中项目地址https://gitcode.com/gh_mirrors/le/AlgoNote点击查看免费下载Z 字形变换Zigzag Conversion是 LeetCode 上编号 0006 的一道经典字符串题要求把给定字符串按照指定行数先折线排布、再逐行读出。本文以《算法通关手册》仓库中的题解原文为主体完整还原题目约束、模拟法解题步骤与 Python 实现并从行号周期性规律出发补充可直接按行定位的等价写法与边界条件分析。读完本文你将掌握方向翻转模拟这一字符串题常用技巧并能独立写出convert(s, numRows)的高效实现。一、题目在仓库中的定位本题是《算法通关手册》AlgoNoteLeetCode 题解模块第 199 题区间中的第 6 题标签为字符串、难度为中等可在题解总表与第 199 题索引中查找到对应条目。配套的字符串基础知识比较、存储结构与字符编码位于字符串基础仓库codes/04_string/目录下还有string_brute_force.py、string_kmp.py、string_rabin_karp.py等可运行的 Python 实现可作为阅读本题时的横向参考。二、题目理解问题描述与要求题目大意给定一个字符串s和行数numRows要求将s以从上往下、从左往右的顺序进行 Z 字形锯齿形排列然后从左往右逐行读取生成一个新的字符串返回。需要实现的函数签名为string convert(string s, int numRows);数据范围约束条件1 ≤ s.length ≤ 1000s由英文字母小写和大写、,与.组成1 ≤ numRows ≤ 1000。示例 1输入s PAYPALISHIRING, numRows 3输出PAHNAPLSIIGYIR。此时 Z 字形排布如下P A H N A P L S I I G Y I R逐行读取第 0 行PAHN、第 1 行APLSIIG、第 2 行YIR拼接即得PAHNAPLSIIGYIR。示例 2输入s PAYPALISHIRING, numRows 4输出PINALSIGYAHRPI。排布如下P I N A L S I G Y A H R P I逐行读取为PIN、ALSIG、YAHR、PI拼接得PINALSIGYAHRPI。这里需要留意一个容易混淆的点Z 字形并不是先横着写一个字母 Z 再折返而是字符串从左往右逐字符地在各行之间竖直向下、斜向上交替放置本质上更像竖折线。理解了这个放置顺序模拟法就顺理成章了。三、解题思路模拟法方向翻转核心思想模拟字符在numRows行之间的下-上-下往返过程把每个字符放入它应属的行最后把所有行按顺序拼接。这一思路在原题解中归纳为三步创建行数组创建numRows个空字符串或空列表用于存放每一行的字符。模拟 Z 字形放置用变量row表示当前所在行用变量direction表示移动方向1表示向下、-1表示向上遍历字符串s中的每个字符将其追加到第row行更新row时一旦到达第0行或第numRows - 1行立即翻转direction。按行读取结果将第0行到第numRows - 1行的字符串依次连接即为最终答案。关键点当numRows 1时只有一行Z 字形退化为一条直线直接返回原字符串否则direction翻转让代码变得繁琐且易错direction控制行号的变化向下时row递增向上时row递减只有在边界第0行或第numRows - 1行处才改变移动方向中间行继续沿当前方向前进。模拟法代码含注释以下为仓库题解原文中的 Python 实现注释在原文档基础上稍作展开class Solution: def convert(self, s: str, numRows: int) - str: # 如果只有一行直接返回原字符串 if numRows 1: return s # 创建 numRows 个空字符串用于存储每一行的字符 rows [] * numRows row 0 # 当前行 direction 1 # 移动方向1 表示向下-1 表示向上 # 遍历字符串中的每个字符 for char in s: # 将当前字符添加到对应行 rows[row] char # 更新行号 row direction # 如果到达边界改变移动方向 if row 0 or row numRows - 1: direction -direction # 将所有行的字符串连接起来 return .join(rows)复杂度分析时间复杂度$O(n)$其中 $n$ 是字符串s的长度——每个字符恰好被处理一次放入某一行并移动行号。空间复杂度$O(n)$行数组最终容纳了全部 $n$ 个字符。从仓库的题解原文可以看到原文档给出的正是时间 $O(n)$、空间 $O(n)$ 的结论见题解原文模拟法无需构造完整的二维网格因此空间占用被压缩到与字符串本身同阶。示例 1 的逐步验证以s PAYPALISHIRING、numRows 3为例逐字符的行号变化为下标从 0 开始下标012345678910111213字符PAYPALISHIRING行号01210121012101于是第 0 行得到PAHN第 1 行得到APLSIIG第 2 行得到YIR三者拼接即PAHNAPLSIIGYIR与示例输出完全一致。四、纵深拓展行号的周期性规律模拟法的本质是让行号序列0, 1, ..., numRows-1, numRows-2, ..., 1, 0, 1, ...不断循环。从源码结构可以推导出一个更直观的周期规律一个完整的向下到顶再向上回的往返共覆盖numRows向下numRows - 2斜向上升不含首尾两行2 * numRows - 2个字符记cycle 2 * numRows - 2则第i个字符在周期内的偏移为pos i % cycle当pos numRows时处于向下段行号为pos否则处于向上段行号为cycle - pos。由此可以写出不依赖方向翻转、直接计算行号的等价实现class Solution: def convert(self, s: str, numRows: int) - str: if numRows 1: return s cycle 2 * numRows - 2 # 一个完整往返覆盖的字符数 rows [] * numRows for i, ch in enumerate(s): pos i % cycle row pos if pos numRows else cycle - pos rows[row] ch return .join(rows)该写法与模拟法时间复杂度同为 $O(n)$、空间复杂度同为 $O(n)$但省去了direction状态代码更简洁也适合作为面试时与模拟法的对照讲法。更进一步还可以按行直接遍历对第r行主列字符的下标依次为r, r cycle, r 2*cycle, ...斜向字符下标为i cycle - 2*r仅当0 r numRows - 1时存在按此规则逐行收集即可得到答案。五、边界条件与实现细节综合题目约束实战中应重点覆盖以下边界场景行为原因numRows 1直接返回s只有一个行任何 Z 字形排布都等于原字符串且此时cycle 0取模运算失去意义numRows len(s)直接返回s每个字符独占一行、竖直排满逐行读取结果仍是s本身numRows 2偶/奇下标字符分入两行斜向段长度为 0Z 字形退化为两列交替s.length 1直接返回s单字符无论行数如何输出都是它自身关于 Python 实现细节rows[row] char在 CPython 中当字符串只有一个引用时通常会被解释器原地扩容优化amortized $O(1)$对本题n ≤ 1000的规模完全足够若追求更稳妥的写法可以改为rows [[] for _ in range(numRows)]收集完毕后用.join(.join(row) for row in rows)一次性拼接。六、小结与相关资源Z 字形变换考察的是把一维字符串按二维坐标规则重排再按行重组的能力模拟法方向翻转与周期公式法按cycle取模定位行号是两条互为印证的主线二者时间复杂度相同后者代码更短、更利于口头推导。需要牢记的要点是numRows 1的特判、边界翻转direction、以及最终按行拼接。进一步延伸阅读与验证资源本题题解原文含完整题目描述、示例与模拟法代码字符串基础字符串比较、顺序/链式存储结构与常见字符编码字符串章节目录Brute Force、KMP、Boyer Moore、字典树等字符串算法的整体脉络字符串算法 Python 实现仓库中string_brute_force.py、string_kmp.py、string_sunday.py等可运行代码可对照体会字符串处理的常见套路题解总表第 199 题区间内与本题同属字符串标签的其他题解如0005. 最长回文子串、0008. 字符串转换整数 (atoi)。赞分享教程文档知识库【免费下载链接】AlgoNote⛽️「算法通关手册」从零开始的「算法与数据结构」学习教程200 道「算法面试热门题目」1000 道「LeetCode 题目解析」持续更新中项目地址https://gitcode.com/gh_mirrors/le/AlgoNote点击查看免费下载相关推荐LeetCode 6. N 字形变换Zigzag Conversion逐行模拟解法详解Python / Java / C 三语言实现与复杂度分析LeetCode 6. N 字形变换Zigzag Conversion逐行模拟解法详解Python / Java / C 三语言实现与复杂度分析 导读示例工程LeetCode-Py算法通关手册从零基础到算法高手LeetCode Py算法通关手册从零基础到算法高手 LeetCode Py算法通关手册是一个系统化的算法学习体系由拥有ACM竞赛经验和多年开发经验的作者创教程文档知识库Craft Agents 任务系统设计Task标签族与TASK-slug编号规范详解Craft Agents 任务系统设计Task标签族与TASK slug编号规范详解 Craft Agents craft agents oss是一个多智人工智能大模型AI AgentMCP Clients工具调用交互助手上一篇突破性能瓶颈Kong网关连接池与IO多路复用深度优化下一篇fd 文件查找工具终极API设计指南库模式接口架构深度解析创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表