6.3 模拟专题:LeetCode 6. Z 字形变换

server/2025/3/31 6:40:17/
1. 题目链接

LeetCode 6. Zigzag Conversion


2. 题目描述

将一个给定字符串 s 按照指定的行数 numRows 进行 Z 字形排列后,逐行读取并返回新的字符串。
示例

  • 输入:s = "PAYPALISHIRING", numRows = 3 → 输出:"PAHNAPLSIIGYIR"
  • 输入:s = "A", numRows = 1 → 输出:"A"

3. 示例分析
  1. 标准 Z 字形排列
    • 输入 s = "PAYPALISHIRING", numRows = 3 的排列如下:
      P   A   H   N  
      A P L S I I G  
      Y   I   R  
      
    • 按行读取结果为 "PAHNAPLSIIGYIR"
  2. 单行排列
    • 输入 s = "ABCD", numRows = 1 → 输出 "ABCD"
  3. 两行排列
    • 输入 s = "ABCDE", numRows = 2 → 排列为 A C EB D,结果为 "ACEB D"(忽略空格)。

4. 算法思路

核心思想数学规律 + 直接构造

  1. 周期分析
    • Z 字形排列的每个周期长度为 d = 2 * numRows - 2。例如,numRows = 3 时,周期为 4。
  2. 行遍历规则
    • 首行和末行:每个周期仅包含一个字符,位置分别为 jj + numRows - 1
    • 中间行:每个周期包含两个字符,位置分别为 j + ij + d - ii 为当前行号)。
  3. 逐行构造
    • 遍历每一行,根据周期规律直接计算字符位置并拼接结果。

5. 边界条件与注意事项
  1. 单行处理
    • numRows = 1 时,直接返回原字符串。
  2. 空字符串处理
    • s 为空,返回空字符串。
  3. 字符位置越界
    • 在中间行遍历时,需确保计算的字符位置不超过字符串长度。
  4. 周期完整性
    • 每个周期的两个字符可能不全存在(如字符串长度不足),需分别判断。

6. 代码实现
class Solution {
public:string convert(string s, int numRows) {if (numRows == 1) return s; // 单行直接返回string ret;int n = s.size();int d = 2 * numRows - 2; // 周期长度for (int i = 0; i < numRows; i++) {if (i == 0) { // 首行for (int j = 0; j < n; j += d) {ret += s[j];}} else if (i == numRows - 1) { // 末行for (int j = i; j < n; j += d) {ret += s[j];}} else { // 中间行for (int j = i, k = d - i; j < n || k < n; j += d, k += d) {if (j < n) ret += s[j];if (k < n) ret += s[k];}}}return ret;}
};

在这里插入图片描述


关键代码解析

  1. 周期计算

    int d = 2 * numRows - 2;
    
    • 每个 Z 字形周期的字符数为 2 * numRows - 2
  2. 首行处理

    for (int j = 0; j < n; j += d) {ret += s[j];
    }
    
    • 首行字符位置为 0, d, 2d, ...
  3. 末行处理

    for (int j = i; j < n; j += d) {ret += s[j];
    }
    
    • 末行字符位置为 numRows - 1, numRows - 1 + d, ...
  4. 中间行处理

    for (int j = i, k = d - i; j < n || k < n; j += d, k += d) {if (j < n) ret += s[j];if (k < n) ret += s[k];
    }
    
    • 中间行的两个字符位置分别为 i, i + d, ...d - i, d - i + d, ...

总结

直接构造法通过数学规律确定 Z 字形排列中每行字符的位置,以线性时间复杂度和空间复杂度高效解决问题。其核心在于 周期分析与位置计算,避免了模拟排列的额外空间消耗。

适用场景

  • 字符串长度较大(n ≤ 1e3)。
  • 需要保证代码高效性和简洁性。

关键点

  • 理解 Z 字形排列的周期性规律。
  • 处理中间行时的双指针遍历逻辑。

http://www.ppmy.cn/server/179162.html

相关文章

蓝之洋科技以AI智能制造引领变革,推动移动电源产业迈向高端智能化!

在全球智能制造加速发展的背景下&#xff0c;深圳市蓝之洋科技有限公司凭借十余年的行业深耕、先进的生产体系、严格的质量标准及持续的技术创新&#xff0c;已成为移动电源领域的领先制造商。作为众多国际品牌的长期合作伙伴&#xff0c;蓝之洋科技不仅在生产制造方面树立了行…

雕马快租:直播设备租赁新趋势,低成本重构传统营销模式的破局之道

引言&#xff1a;直播电商浪潮下的设备成本困局 随着直播电商渗透率突破60%&#xff08;艾媒咨询2025年数据&#xff09;&#xff0c;企业与个人主播对直播设备的需求呈指数级增长。然而&#xff0c;一套专业直播设备的采购成本动辄数万元&#xff0c;叠加设备迭代周期缩短至1…

软件开发过程中常用的调试工具(gdb)

gdb 因为我们公司其中脚本中有rk的gdb调试工具脚本&#xff0c;内部只需要将其打开后进行编译即可&#xff1a; 需要将编译出来的cvr_app 第一种&#xff1a;使用gdb将app给跑起来&#xff1a;gdb cvr_app 然后在出现问题时&#xff1a; 输入bt&#xff0c;可以打印出当前…

从零构建大语言模型全栈开发指南:第二部分:模型架构设计与实现-2.2.3实战案例:在笔记本电脑上运行轻量级LLM

👉 点击关注不迷路 👉 点击关注不迷路 👉 点击关注不迷路 文章大纲 实战案例:在笔记本电脑上运行轻量级LLM2.2.3 模型架构设计与实现1. 环境与工具准备1.1 硬件要求1.2 软件栈选择2. 轻量级模型架构设计2.1 模型参数配置2.2 关键技术优化3. 实战流程3.1 数据准备流程3.2…

毛乌素沙地shp范围

毛乌素沙地简介 地理位置 毛乌素沙地位于中国西北部&#xff0c;地跨内蒙古自治区鄂尔多斯市、陕西省榆林市以及宁夏回族自治区盐池县&#xff0c;处于鄂尔多斯高原与黄土高原的过渡地带&#xff0c;总面积约4.22万平方公里&#xff0c;是中国四大沙地之一&#xff08;其他为科…

【C语言】多进程/多线程

【C语言】多进程/多线程 参考链接多进程/多线程服务器1. 多进程服务器2. 多线程服务器 结语参考链接 参考链接 c 中文网 菜鸟 c 多进程/多线程服务器 多进程和多线程是常用的并发编程技术。它们都允许程序同时执行多个任务&#xff0c;提高了系统的资源利用率和程序的运行效率…

IntelliJ IDEA 将 Spring Boot 项目远程部署到服务器

使用 IntelliJ IDEA 将 Spring Boot 项目远程部署到服务器的详细步骤&#xff0c;涵盖多种常见方法&#xff1a; 方法一&#xff1a;通过 SSH Maven 插件直接部署 1. 服务器环境准备 确保服务器已安装&#xff1a; Java 运行环境&#xff08;与项目 JDK 版本一致&#xff0…

护网中的应急响应(奇安信蓝中面试)

《网安面试指南》https://mp.weixin.qq.com/s/RIVYDmxI9g_TgGrpbdDKtA?token1860256701&langzh_CN 5000篇网安资料库https://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247486065&idx2&snb30ade8200e842743339d428f414475e&chksmc0e4732df793fa3bf39…