news 2026/2/6 13:53:56

LeetCode 6. Z 字形变换 | 详细题解(附 C++ 代码)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
LeetCode 6. Z 字形变换 | 详细题解(附 C++ 代码)

一、题目描述

题目链接:LeetCode 6. Z 字形变换

题目要求

将字符串s按指定行数numRows排成Z 字形(先从上到下,再从右到左斜向上),然后从左到右逐行读取,输出新字符串。

示例演示

  • 输入:s = "PAYPALISHIRING", numRows = 3
  • Z 字形排列:

plaintext

P A H N A P L S I I G Y I R
  • 输出:"PAHNAPLSIIGYIR"

二、解题思路:Z 字的 “周期” 与 “方向”

要解决这道题,首先得搞懂 Z 字形的排列规律

1. 周期规律

Z 字形的每一个 “完整折回” 是一个周期,周期长度为:t=2×numRows−2(比如numRows=3时,周期t=4:向下 3 个字符 + 斜向上 2 个字符)

2. 方向切换

在一个周期内,字符的移动方向分两种:

  • numRows-1个字符:垂直向下(行 + 1);
  • numRows-2个字符:斜向上(行 - 1,列 + 1)。

3. 核心解题步骤

我们用模拟矩阵法实现(直观易懂):

  1. 处理特殊情况(行数为 1 / 行数≥字符串长度);
  2. 计算周期和矩阵的行列数;
  3. 模拟 Z 字路径,将字符填充到矩阵中;
  4. 逐行读取矩阵,拼接成结果字符串。

三、图解过程(以示例 1 为例)

s="PAYPALISHIRING", numRows=3为例:

步骤 1:计算周期和矩阵大小

  • 周期t=2×3-2=4
  • 字符串长度n=14,总周期数为(14+4-1)/4=4(向上取整);
  • 矩阵列数c=4×(3-1)=8(每个周期占 2 列)。

步骤 2:填充矩阵

遍历字符串,按方向填充字符:

  • 第 1 个字符P:坐标 (0,0),向下移动→行 + 1;
  • 第 2 个字符A:坐标 (1,0),向下移动→行 + 1;
  • 第 3 个字符Y:坐标 (2,0),进入周期后半段→斜向上(行 - 1,列 + 1);
  • 第 4 个字符P:坐标 (1,1),斜向上→行 - 1,列 + 1;
  • 以此类推,直到填充完所有字符。

步骤 3:逐行读取

矩阵填充完成后,逐行拼接非空字符:

  • 第 0 行:P A H N→ 拼接为PAHN
  • 第 1 行:A P L S I I G→ 拼接为APLSIIG
  • 第 2 行:Y I R→ 拼接为YIR
  • 最终结果:PAHNAPLSIIGYIR

四、代码细节说明

  1. 特殊情况处理:当行数为 1 时,Z 字就是原字符串;当行数≥字符串长度时,无法形成 Z 字,直接返回原串。

  2. 矩阵大小计算

    • 周期t:Z 字每 “一折” 的字符数;
    • 列数c:通过 “向上取整” 计算总周期数,再乘以每个周期的列数r-1
  3. 方向控制:用i % t判断当前字符在周期中的位置:

    • i%t < r-1:周期前半段,向下移动(行 + 1);
    • 否则:周期后半段,斜向上移动(行 - 1,列 + 1)。

五、复杂度分析

  • 时间复杂度:O(r×c)填充矩阵和拼接结果的时间,r是行数,c是列数,均与字符串长度呈线性关系。
  • 空间复杂度:O(r×c)存储矩阵的空间,可优化为O(n)(直接按行存储字符,无需完整矩阵)。

六、优化思路(空间 O (n))

如果想优化空间,可放弃完整矩阵构建,直接按行存储字符

  • 定义行数对应的字符串数组,遍历原字符串时直接将字符追加到对应行;
  • 到达行首 / 行尾时切换移动方向,避免矩阵的空间浪费;
  • 最终将各行字符串拼接即可得到结果,空间复杂度可降至O(n)。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/6 18:19:44

22、Linux 系统基础管理入门指南

Linux 系统基础管理入门指南 1. 系统管理任务概述 系统管理涵盖了维持计算机系统正常运行的各项任务,系统可以是独立的客户端机器、支撑企业运营的网络服务器,或者介于两者之间的其他形式。系统管理员负责处理这些任务,确保系统按需求运行。 系统管理员的职责包括: - 添…

作者头像 李华
网站建设 2026/2/4 12:38:49

2026年大模型应用开发学习路线:四阶段转型指南,抓住未来3年的职业发展机遇!转AI大模型开发学习顺序真的很重要!

简介 文章指出大模型技术正在重塑IT行业&#xff0c;企业招聘要求大模型能力已成为趋势。为帮助程序员成功转型&#xff0c;文章提出了四阶段学习路径&#xff1a;大模型基础、RAG应用开发工程、大模型Agent应用架构、大模型微调与私有化部署。强调学习顺序的重要性&#xff0…

作者头像 李华
网站建设 2026/2/4 14:21:46

26、Linux文件系统管理全攻略

Linux文件系统管理全攻略 1. 探索Linux文件系统 1.1 文件系统的类比理解 文件系统指的是文件和目录的组织方式。Linux系统中,文件和目录以一种有组织的方式存储信息,这类似于纸质文件归档系统。比如,在纸质归档时,我们会把多页文件放入文件夹,再将文件夹存放在文件柜中…

作者头像 李华
网站建设 2026/2/4 20:27:18

27、Linux 系统文件管理与共享全攻略

Linux 系统文件管理与共享全攻略 1. 自动化备份设置 首先,使用以下 crontab 命令提交作业调度: crontab backups完成此操作后,你就设置好了自动化备份。之后,你只需每天在磁带驱动器中放入新磁带,并为每盘磁带贴上合适的标签。 2. 访问 DOS 或 Windows 文件系统 如…

作者头像 李华
网站建设 2026/2/6 12:05:39

33、网络安全测试与Shell脚本编程入门

网络安全测试与Shell脚本编程入门 1. 漏洞测试类型 渗透测试的首要目的是识别漏洞。从这个角度看,有三种方法来进行渗透测试:黑盒、白盒和灰盒。这三种方法的区别在于初始阶段所掌握的信息量。 1.1 黑盒测试 黑盒测试假设对网络一无所知,就像一个局外人偶然发现网络并试…

作者头像 李华
网站建设 2026/2/4 21:22:29

Reverse Engineer‘s Toolkit:一体化逆向工程解决方案

Reverse Engineers Toolkit&#xff1a;一体化逆向工程解决方案 【免费下载链接】retoolkit Reverse Engineers Toolkit 项目地址: https://gitcode.com/gh_mirrors/re/retoolkit 项目概述 Reverse Engineers Toolkit&#xff08;简称retoolkit&#xff09;是一个专为W…

作者头像 李华