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

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

Z 字形变换通过模拟行列周期规律解决,核心在于识别 2*rows-2 的循环下标,分首行、中间行和末行处理。外观数列则利用双指针模拟字符串计数过程,迭代生成下一项。两题均考察基础模拟能力与边界处理,适合巩固数组与字符串操作技巧。

zhang发布于 2026/3/16更新于 2026/5/34 浏览
算法实战:Z 字形变换与外观数列解析

Z 字形变换

题目链接:

6. Z 字形变换 - 力扣(LeetCode)

题目描述:

题目示意图

题目示例:

示例图

解法(模拟 + 找规律)

思路分析

这道题的核心在于找到字符排列的周期性规律。假设行数 numRows 为 4,我们可以画出 Z 字形的下标变化:

0       6      12
1    5  7   11
2  4     8  10
3       9

不难发现,数据是以 2 * numRows - 2 为一个周期进行循环的。对于每一行,我们需要确定该行在字符串中的索引位置。

  • 第一行和最后一行:下标间隔固定为 2 * numRows - 2。
  • 中间行:除了首尾元素外,每个周期内包含两个字符,分别位于当前周期的起始偏移量和结束偏移量处。

具体来看,第 k 行(非首尾)的两个下标分别为 i 和 j,其中 i 是主对角线上的点,j 是斜线回上的点。它们在一个周期内的相对位置是对称的。

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;
    }
};

注意:这里使用双指针逻辑处理中间行,i 对应向下走的步长,j 对应向上走的步长。当 i 或 j 超出字符串长度时停止添加,确保边界安全。


外观数列

题目链接:

38. 外观数列 - 力扣(LeetCode)

题目描述:

题目示意图

题目示例:

示例图

序列生成图

解法(模拟)

思路分析

外观数列(Count and Say)的本质是'读'出前一项的内容。每一项都是对前一项连续相同字符的描述:统计个数 + 字符本身。

例如:

  • 第 1 项:"1"
  • 第 2 项:"11" (1 个 1)
  • 第 3 项:"21" (2 个 1)
  • 第 4 项:"1211" (1 个 2,1 个 1)

我们可以通过迭代的方式,利用双指针扫描当前字符串,统计连续相同字符的数量,拼接成下一项。直到迭代到第 n 项为止。

C++ 代码实现
class Solution {
public:
    string countAndSay(int n) {
        string ret = "1";
        for (int i = 1; i < n; i++) {
            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;
    }
};

关键点:内层循环通过移动 right 指针来统计连续相同字符的长度,left 记录当前段的起始位置。每次统计完一段后,将数量转换为字符串并追加字符,然后更新 left 继续处理下一段。

目录

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

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

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

更多推荐文章

查看全部
  • Python OCR 技术入门与验证码识别实战
  • 基于 Trae Agent 与 MCP Tools 实现 Gitee 自动化辅助
  • AI 工具泛滥时代,为什么“能力”越来越不值钱?
  • 大语言模型(LLM)学习路线与初学者入门指南
  • 数据结构进阶:单调栈、并查集与字符串哈希
  • QGIS Python 编程秘籍(一)
  • Ollama 本地部署与运行大模型完全指南
  • OpenClaw 跨平台安装教程:Windows、macOS 与 Linux
  • 国内互联网大厂薪资、职级与绩效考核体系详解
  • Java 集成 AI 能力实战:云端 API 与本地模型双方案
  • ABB PC SDK 开发指南:机器人编程控制
  • VS Code Copilot 实战指南:从安装到 Agent 模式
  • 苍穹外卖项目实战:Spring Task 定时任务与 WebSocket 消息推送
  • 2026 年 3 月全球 AI 前沿动态与产业洞察
  • 大语言模型 Prompt 工程:从理论到实践
  • AI 大模型在医疗、金融、法律及教育等行业的应用概览
  • AI Agent 新范式:基于 FastGPT 与 MCP 协议构建工具增强型智能体
  • 多语言 Prompt 实践:中文、英文、日文混写技巧
  • Claude Code + GLM4.7 修复前端 Bug 的踩坑实录与经验总结
  • SpringBoot 源码解析:AnnotationConfigServletWebServerApplicationContext 构造方法

相关免费在线工具

  • 加密/解密文本

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