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

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

Z 字形变换通过模拟周期规律分首尾中间行处理,外观数列利用双指针迭代统计连续字符生成新序列。提供 C++ 实现方案及核心逻辑推导,帮助理解模拟类算法解题思路。

锁机制发布于 2026/3/24更新于 2026/9/968 浏览
Z 字形变换与外观数列算法实战解析

Z 字形变换示意图

Z 字形变换

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

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

解法(模拟 + 找规律)

算法思路

观察 Z 字形排列的规律,可以发现数据是以 2 * numRows - 2 为一个周期进行循环的。以 numRows = 4 为例,下标变化如下:

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

第一行和最后一行的下标差值为固定周期 d = 2 * numRows - 2。中间的行则包含两个序列:一个是主周期序列,另一个是倒序填充的间隔序列。

具体逻辑分为三部分处理:

  1. 首行:从索引 0 开始,步长为 d。
  2. 中间行:对于第 k 行,存在两个下标序列,分别是 i 和 j,其中 j = d - i。交替添加这两个位置的值。
  3. 末行:从索引 numRows - 1 开始,步长为 d。
C++ 代码实现
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. 处理第一行
        for (int i = 0; i < n; i += d) ret += s[i];
        
        // 2. 处理中间的几行
        for (int k = 1; 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;
    }
};
1
for
int
if
if
// 3. 处理最后一行
for
int
1
return

解题笔记推导 解题笔记公式


外观数列

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

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

  1. 1
  2. 11 (前一项是 1 个 1)
  3. 21 (前一项是 2 个 1)
  4. 1211 (前一项是 1 个 2、1 个 1)

解法(模拟)

算法思路

核心在于统计连续相同字符的个数并拼接。可以使用双指针遍历当前字符串:左指针 left 标记字符起始位置,右指针 right 向后移动直到遇到不同字符或到达末尾。记录重复次数 count,拼接 to_string(count) 和字符本身,更新 left 继续下一轮。

迭代 n - 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;
    }
};

解题笔记步骤 解题笔记总结

目录

  1. Z 字形变换
  2. 解法(模拟 + 找规律)
  3. 算法思路
  4. C++ 代码实现
  5. 外观数列
  6. 解法(模拟)
  7. 算法思路
  8. C++ 代码实现

更多推荐文章

查看全部
  • AI 风口下的冷思考:普通人如何理性入局与避坑
  • 计算机图形学 Visual C++ MFC 基础绘图开发
  • 从零训练大语言模型:环境与代码实战指南
  • Android 中大厂秋招常见面试题及答案解析
  • 开箱即用的 React K 线图组件与股票数据 SDK
  • 基于 ESP32 的无人机飞控日志 SD NAND 存储方案
  • OpenClaw Mac 安装指南
  • 基于 STM32 的智能家居环境监测系统设计
  • 漏洞扫描工具整合使用教程
  • VS Code 集成 Overleaf 实现本地 AI 辅助 LaTeX 写作
  • 百度为何不做 Sora:解析其多模态技术路线与 iRAG 策略
  • Android 开发者进阶:性能优化核心领域与实战方向
  • GitHub 热门项目日榜 (2026-02-24)
  • 基于 SpringBoot2+Vue3 的旅游出行指南系统设计与实现
  • 基于 Kiro 与 AIClient-2-API 实现 Claude 模型免费调用方案
  • Python 核心语法实战:变量、流程控制与函数详解
  • Linux 进程间通信进阶:管道与共享内存实战
  • Android Framework 框架层源码深度解析:启动流程与核心组件
  • 大模型定义、发展历程及应用场景全解析
  • 使用 Copilot 制定 60 天 AI 学习计划并同步至 Outlook 日程

相关免费在线工具

  • 加密/解密文本

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