跳到主要内容
极客日志极客日志
首页博客AI提示词GitHub精选代理工具
搜索
|注册
博客列表
C++算法

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

Z 字形变换通过模拟行索引变化找出周期规律,将字符串按 Z 形排列后逐行读取。外观数列则利用双指针统计连续相同字符个数迭代生成新序列。两者均属于基础模拟类算法题,重点在于发现数据变换模式并高效实现。

DataScient发布于 2026/3/23更新于 2026/5/1211 浏览
算法实战:Z 字形变换与外观数列详解

Z 字形变换

题目链接:

6. Z 字形变换 - LeetCode

题目描述:

题目示意图

题目示例:

示例图

解法(模拟 + 找规律)

思路分析

这道题的核心在于找到行索引变化的周期规律。假设行数 numRows 为 4,字符排列成 Z 字形时,下标变化如下:

0       6      12
  1   5   7  11
    2       8
    3       9

不难发现,数据是以 2 * numRows - 2 为一个周期进行循环的。我们可以把下标替换成用周期表示的变量:

  • 第一行:下标是 0, 2*numRows-2, 4*numRows-4...,即差值为周期的等差数列。
  • 最后一行:同理,也是差值为周期的等差数列。
  • 中间行:除了首尾元素外,每组周期内有两个字符。例如第二行,下标围绕周期的倍数左右取值,分别是 (2n-1) 和 (2n) 的位置。

基于这个规律,我们不需要真的构建一个二维数组来存储 Z 字形,而是直接通过数学计算确定每个字符应该归属哪一行,或者按行遍历字符串时直接跳过不需要的字符。

这里采用按行遍历的策略:先处理第一行,再处理中间的每一行,最后处理最后一行。对于中间行,每个周期需要取两个字符,分别对应正向和反向的下标。

代码实现
class Solution {
public:
    string convert(string s, int numRows) {
        if (numRows == 1) return s;
        string ret;
        int d = 2 * numRows - 2, n = s.size();
        
        // 1. 处理第一行
         ( i = ; i < n; i += d) ret += s[i];
        
        
         ( k = ; k < numRows - ; k++) {
             ( i = k, j = d - k; i < n || j < n; i += d, j += d) {
                 (i < n) ret += s[i];
                 (j < n) ret += s[j];
            }
        }
        
        
         ( i = numRows - ; i < n; i += d) ret += s[i];
        
         ret;
    }
};
for
int
0
// 2. 处理中间的几行
for
int
1
1
for
int
if
if
// 3. 处理最后一行
for
int
1
return

注意:在中间行的双重循环中,i 代表当前周期内的第一个字符下标,j 代表第二个。由于边界条件可能不同步(比如最后一个周期不完整),所以需要用 if 判断是否越界后再追加字符。

手写笔记参考

解题思路笔记

公式推导


外观数列

题目链接:

38. 外观数列 - LeetCode

题目描述:

题目示意图

题目示例:

示例图

示例图

解法(模拟)

思路分析

外观数列(Count and Say)的本质是对前一项字符串的描述。规则很简单:依次统计字符串中连续且相同的字符个数,然后拼接'个数 + 字符'。

例如:

  • 第 1 项:"1"
  • 第 2 项:读作 "1 个 1",即 "11"
  • 第 3 项:读作 "2 个 1",即 "21"
  • 第 4 项:读作 "1 个 2, 1 个 1",即 "1211"

这是一个典型的迭代过程。我们需要从第 1 项开始,重复 n-1 次生成下一项。在生成过程中,使用双指针(或游标)来扫描当前字符串,统计连续相同字符的长度,然后转换为字符串拼接到结果中。

代码实现
class Solution {
public:
    string countAndSay(int n) {
        string ret = "1";
        for (int i = 1; i < n; i++) { // 解释 n - 1 次 ret 即可
            string tmp;
            for (int left = 0, right = 0, count = 0; right < ret.size(); ) {
                while (right < ret.size() && ret[left] == ret[right]) right++;
                tmp += to_string(right - left) + ret[left];
                left = right;
            }
            ret = tmp;
        }
        return ret;
    }
};

提示:to_string 函数可以将整数转为字符串。这里的逻辑核心在于内层 while 循环不断右移 right 指针直到遇到不同字符,此时 right - left 就是当前字符的连续出现次数。

手写笔记参考

解题思路笔记

公式推导


这两道题都是考察对字符串操作和规律发现的经典模拟题。Z 字形变换关键在于数学建模,而外观数列则侧重于模拟过程的准确性。掌握这类题目的通用解法,有助于提升处理复杂逻辑问题的能力。

目录

  1. Z 字形变换
  2. 解法(模拟 + 找规律)
  3. 思路分析
  4. 代码实现
  5. 手写笔记参考
  6. 外观数列
  7. 解法(模拟)
  8. 思路分析
  9. 代码实现
  10. 手写笔记参考
  • 💰 8折买阿里云服务器限时8折了解详情
  • GPT-5.5 超高智商模型1元抵1刀ChatGPT中转购买
  • 代充Chatgpt Plus/pro 帐号了解详情
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • 无人机地面站 QGroundControl 在 Ubuntu 20.04 下的安装指南
  • IDEA/WebStorm 切换分支方法
  • LeetCode 141:环形链表检测的经典解法
  • Java Web 开发入门:基础概念、环境搭建与 Servlet/JSP
  • OpenClaw B 端企业级应用实战:CentOS 7 快速部署指南
  • Python 代码检查工具 Ruff 使用指南
  • Java synchronized 关键字用法与底层原理
  • Jetpack Compose 完全开发手册:从入门到精通
  • C++ Google Test (gtest) 全面使用指南
  • PentAGI Docker 环境部署指南
  • .NET 集成 GoView 低代码可视化大屏实战指南
  • 深度学习八大经典神经网络架构详解与实战指南
  • FPGA 开发环境搭建:Quartus II 13.1 与 ModelSim 安装配置指南
  • 算法学习入门指南:数据结构与核心算法实战
  • Ubuntu 远程 SSH 连接配置与 VS Code 使用
  • PDF 压缩工具:纯前端开源本地压缩方案及实现思路
  • ComfyUI 插件管理完全指南
  • 基于 Python 与 AI 的智能害虫识别系统实战
  • Python 调用 Ollama 本地大模型 API 完全指南
  • Spring Cloud Gateway 内置 Filter 实战:AddRequestHeader 与 RewritePath

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如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