跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
C++算法

算法模拟实战:Z 字形变换与外观数列详解

Z 字形变换与外观数列是算法模拟中的典型题目。Z 字形变换通过找规律发现下标以 2*numRows-2 为周期,分首行、中间行、末行处理;外观数列则利用双指针统计连续相同字符个数迭代生成。两者均侧重模拟思想,代码实现需注意边界条件与字符串拼接效率。

BackendPro发布于 2026/2/13更新于 2026/9/852 浏览
算法模拟实战:Z 字形变换与外观数列详解

算法模拟实战:Z 字形变换与外观数列详解

本文聚焦于两道经典的算法模拟题,通过代码实现与逻辑推导,深入剖析字符串处理中的周期规律与迭代统计技巧。

Z 字形变换

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

题目描述: 将给定字符串 s 根据给定的行数 numRows,以从上往下、从左到右进行 Z 字形排列。

Z 字形排列示意图

示例: 输入:s = "PAYPALISHIRING", numRows = 3 输出:"PAHNAPLSIIGYIR"

思路分析

这道题的核心在于找到下标的变化规律。当 numRows 为 4 时,字符的排列呈现出明显的周期性。

观察下标序列可以发现,数据是以 2 * numRows - 2 为一个周期进行循环的。我们可以将问题拆解为三部分处理:首行、中间行、末行。

  1. 首行与末行:这两行的下标间隔固定,均为 2 * numRows - 2。例如第一行是 0, d, 2d...(其中 d 为周期)。
  2. 中间行:对于第 k 行(0 < k < numRows - 1),每个周期内包含两个字符。第一个字符的下标是 i + k,第二个字符的下标是 i + (d - k)。我们需要交替添加这两个位置的字符。

这种分情况讨论的方法避免了复杂的数学映射,直接模拟了读取过程,逻辑清晰且易于实现。

C++ 代码实现

class Solution {
public:
    string convert(string s, int numRows) {
        if (numRows == 1) return s;
        
        string ret;
        int d = 2 * numRows - 2;
        int n = s.size();

        // 1. 处理第一行
        for (int i = 0; i < n; i += d) {
            ret += s[i];
        }

        // 2. 处理中间的几行
        for (int k = 1; k < numRows - 1; k++) {
            for (int i = k, j = d - k; i < n || j < n; i += d, j += d) {
                if (i < n) ret += s[i];
                if (j < n) ret += s[j];
            }
        }

        // 3. 处理最后一行
        for (int i = numRows - 1; i < n; i += d) {
            ret += s[i];
        }

        return ret;
    }
};

解题笔记

手写推导过程有助于理解边界条件,特别是中间行双指针的同步移动逻辑。

手写笔记展示

公式推导


外观数列

题目链接: 38. 外观数列 - LeetCode

题目描述: 「外观数列」是一个整数序列,从数字 1 开始,序列中的每一项都是对前一项的描述。

外观数列示例

示例: 输入:n = 4 输出:"1211" 解释:

  1. 第 1 项:1
  2. 第 2 项:11 (读作 "1 个 1")
  3. 第 3 项:21 (读作 "2 个 1")
  4. 第 4 项:1211 (读作 "1 个 2,1 个 1")

思路分析

外观数列的本质是模拟。我们需要遍历当前字符串,统计连续相同字符的个数,并将'个数'和'字符本身'拼接成下一项。

具体步骤如下:

  1. 初始化结果为 "1"。
  2. 循环 n - 1 次生成后续项。
  3. 在每次循环中,使用双指针(或单指针配合计数)扫描当前字符串。
  4. 当遇到不同字符或到达末尾时,记录当前字符出现的次数,拼接到临时结果中。
  5. 更新当前字符串为新生成的结果。

注意处理字符串拼接时的效率问题,虽然本题数据规模不大,但养成使用 string 累加的习惯很重要。

C++ 代码实现

class Solution {
public:
    string countAndSay(int n) {
        string ret = "1";
        for (int i = 1; i < n; i++) {
            string tmp;
            int left = 0, right = 0, count = 0;
            while (right < ret.size()) {
                while (right < ret.size() && ret[left] == ret[right]) {
                    right++;
                }
                tmp += to_string(right - left);
                tmp += ret[left];
                left = right;
            }
            ret = tmp;
        }
        return ret;
    }
};

解题笔记

通过双指针快速定位连续区间的结束位置,能显著简化逻辑判断。

手写笔记展示

公式推导


总结

这两道题虽然难度适中,但非常考验对字符串操作和规律发现的敏感度。

  • Z 字形变换:关键在于识别周期性,避免使用二维数组模拟,直接计算下标更节省空间。
  • 外观数列:核心在于准确统计连续字符,注意边界条件的判断。

掌握这类模拟思想,对于解决更多涉及状态转换的问题大有裨益。

目录

  1. 算法模拟实战:Z 字形变换与外观数列详解
  2. Z 字形变换
  3. 思路分析
  4. C++ 代码实现
  5. 解题笔记
  6. 外观数列
  7. 思路分析
  8. C++ 代码实现
  9. 解题笔记
  10. 总结

更多推荐文章

查看全部
  • 无人机低空智能巡飞巡检平台架构与核心能力解析
  • C++ STL 关联容器实战:set、map 与 multiset 详解
  • Vue 基础入门:核心设计思想深度拆解
  • Android 集成 WebRTC 与 VAD 的 AI 辅助开发实战:从选型到性能优化
  • AI 数据标注平台的选型与实践:效率提升背后的技术逻辑
  • 本地搭建带知识库的 AI 助手:Ollama + Open WebUI
  • AI 辅助 Python 毕业设计:选题评估与原型构建
  • AIGC视频生成成本优化:20秒与30秒模型选型与价格对比
  • 2025 年 11 月 TIOBE 排行榜:C# 能否首次超越 Java?
  • LeetCode 383. 赎金信:哈希表与数组计数法对比
  • TCP 协议详解:报文格式、三次握手、滑动窗口与拥塞控制
  • 论文笔记:OmniVTLA 视觉 - 触觉 - 语言 - 行动模型与语义对齐触觉感知
  • Linux 下 C++ 线程池实现与并发安全详解
  • 现代 C++ 新特性 constexpr:从 C++11 到 C++20 的演进
  • Java 对接拉卡拉支付完整指南
  • Rust 异步测试与调试实战指南
  • Pi0 机器人 VLA 大模型在昇腾 A2 平台上的测评
  • 大型语言模型 Prompt 工程的核心原则与最佳实践
  • 低代码平台分类与价值取向:业务开发者与专业开发者视角
  • 人工智能时代的产品经理:挑战、机遇与转型路径

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online