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

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

Z 字形变换利用周期性规律分首尾行与中间行处理,时间复杂度 O(n)。外观数列通过双指针统计连续字符生成新序列,迭代 n-1 次完成。代码采用 C++ 实现,注重边界条件判断与逻辑清晰性。

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

Z 字形变换

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

题目描述: 将字符串按照指定行数进行 Z 字形排列,然后按行读取生成新字符串。

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

解题思路

这道题的核心在于找到字符在 Z 字形中的位置规律。当行数 numRows 确定后,整个排列呈现出周期性。周期长度为 2 * numRows - 2。

我们可以把每一行看作一个独立的序列来处理:

  1. 首行和末行:字符间隔固定为周期长度 d = 2 * numRows - 2。
  2. 中间行:除了首尾的间隔外,每两个字符之间还有一个额外的字符,其位置可以通过对称性计算得出。具体来说,第 k 行的字符下标满足 i 和 d - i 的交替出现模式。

基于这个观察,我们不需要真正构建二维数组,只需遍历原字符串,根据当前字符所在的行号直接拼接到结果中即可。这样空间复杂度可以优化到 O(1)(不计结果字符串)。

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();

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

        // 处理中间几行
        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];
            }
        }

        
         ( i = numRows - ; i < n; i += d) {
            ret += s[i];
        }

         ret;
    }
};
// 处理最后一行
for
int
1
return

外观数列

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

题目描述: 给定一个正整数 n,返回外观数列的第 n 项。外观数列每一项都是对前一项的描述。

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

  1. 第 1 项:"1"
  2. 第 2 项:"11" (前一项是 1 个 1)
  3. 第 3 项:"21" (前一项是 2 个 1)
  4. 第 4 项:"1211" (前一项是 1 个 2,1 个 1)

解题思路

这是一个典型的模拟问题。我们需要迭代地生成下一项。核心逻辑是'读'出上一项的数字序列。

对于每一项字符串,使用双指针扫描:

  • 左指针 left 标记当前连续相同字符的起始位置。
  • 右指针 right 向后移动,直到遇到不同字符或到达末尾。
  • 统计个数 count = right - left,拼接 to_string(count) 和字符本身 ret[left]。
  • 更新 left = right,继续处理下一段。

重复此过程 n - 1 次即可得到最终结果。注意边界条件,当 n=1 时直接返回 "1"。

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

总结

这两道题都考察了对字符串操作的熟练度以及对规律的敏感度。

  • Z 字形变换的关键在于发现周期性,避免使用二维数组模拟,从而降低空间开销。
  • 外观数列则是简单的模拟过程,重点在于如何高效地统计连续字符并拼接新字符串。

在实际面试中,这类题目常作为考察基础编码能力的入口,建议多练习边界条件的处理,例如空串、单行、n=1 等情况。

目录

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

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

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

更多推荐文章

查看全部
  • 在鸿蒙游戏开发中接入 AI NPC 的体验与实践
  • ComfyUI-Manager 使用指南:高效管理自定义节点与模型
  • 医疗 AI 可信革命全栈实现:向量索引与贝叶斯网络
  • Flutter 三方库 eth_sig_util 鸿蒙适配指南:以太坊加密签名核心实现
  • 深度学习卷积神经网络(CNN)实战应用
  • Trae IDE 自定义规则配置指南
  • C++ 核心基础概念解析
  • 2026 年高校 AIGC 检测标准汇总与应对建议
  • 飞书机器人同步日程的技术实现与优化
  • CSS 元素显示模式详解:块级、行内与行内块
  • 海螺 AI 多模态架构解析与 API 接入指南
  • 前端开发:避免重复造轮子,选用成熟组件库
  • Python 字典查询高效的底层原理
  • 基于腾讯云 HAI 与 DeepSeek 快速构建个人网页
  • Android DL 插件化开发步骤与核心注意事项
  • 使用 Java 和 Python 发送消息至飞书自定义机器人
  • 区块链技术:时间长河共识算法(Time River Consensus Algorithm)核心机制
  • Whisper.cpp 跨平台语音识别快速部署方案
  • Stable Diffusion 模型原理与本地部署实践
  • Linux 多线程基础:线程与进程的关系及特性

相关免费在线工具

  • 加密/解密文本

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