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

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

Z 字形变换通过寻找周期规律(2*numRows-2)分首行、中间行和末行处理;外观数列利用双指针模拟统计连续相同字符个数并迭代生成新字符串。两者均属于模拟类算法,适合巩固基础逻辑与代码实现能力。

雪落无声发布于 2026/3/29更新于 2026/10/2188 浏览
算法实战:Z 字形变换与外观数列模拟解法

在这里插入图片描述

41. Z 字形变换

题目链接:

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

题目描述:

在这里插入图片描述

题目示例:

在这里插入图片描述

解题思路

这道题的核心在于找规律。假设行数 numRows 为 4,字符排列成 N 字形时,下标变化呈现周期性。

观察发现,数据是以 2 * numRows - 2 为一个周期进行循环的。我们可以将下标映射到这个周期内:

  • 第一行的数是:0, 2row - 2, 4row - 4...
  • 第二行的数是:1, (2row - 2) - 1, (2row - 2) + 1...
  • 中间行除了首尾外,每组下标围绕周期的倍数左右取值。
  • 最后一行的数则是等差数列。

基于这个规律,我们可以分三部分处理:第一行、中间行、最后一行。这样就能避免复杂的二维数组模拟,直接通过数学计算拼接字符串。

代码实现

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

42. 外观数列

题目链接:

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

题目描述:

在这里插入图片描述

题目示例:

在这里插入图片描述

在这里插入图片描述

解题思路

外观数列的本质是'读'出上一项的结果。规则很简单:统计连续且相同的字符个数,然后报出'个数 + 字符'。

例如 1 读作 11(一个 1),11 读作 21(两个 1)。我们可以通过双指针模拟这个过程:左指针标记当前字符起始位置,右指针向后遍历直到遇到不同字符,计算出长度后拼接到结果中。

迭代 n-1 次即可得到第 n 项。

代码实现

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; 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 字形变换考察的是对周期规律的抽象能力,而外观数列则是对字符串遍历和构造的基本功训练。掌握这类题目的关键在于理清边界条件,比如 Z 字形中的首末行处理,以及外观数列中的指针移动逻辑。

目录

  1. 41. Z 字形变换
  2. 解题思路
  3. 代码实现
  4. 42. 外观数列
  5. 解题思路
  6. 代码实现

更多推荐文章

查看全部
  • 链表两两交换:Java 递归与迭代三种实现方案
  • 二叉树算法实战:第 K 小元素与所有路径的 DFS 解法
  • Python 3.12.0 Windows 环境安装与配置指南
  • OpenClaw 漏洞预警:如何为 AI 代理添加行为审计?
  • ThinkPHP 5.1 环境安装与配置指南
  • 面试高频缓存算法:LRU 与 LFU 原理及 Java 实现
  • MCP 实战:Figma 设计稿自动转前端代码
  • 基于扣子平台搭建 AI 智能体与变现路径指南
  • Java JDK 安装与环境配置教程
  • PostgreSQL 动态分区裁剪技术:查询性能优化实战
  • Arduino BLDC 超声波与 PID 控制跟随机器人实战
  • WordPress 基础配置与 Spring Boot 接口开发实战记录
  • Docker Desktop + WSL2 安装配置与核心应用实战
  • 中国黑客群体收入现状与风险分析
  • 飞算 JavaAI 编程助手在 IDEA 中的安装教程:本地、离线及在线方法
  • 基于 FastGPT 与 MCP 协议构建工具增强型智能体
  • 嵌入式CAN通信:C++与SocketCAN的现代封装实践
  • 位运算实战:两数之和、唯一数字与消失数字解析
  • 医疗 NLP 实战:从电子病历分析到智能问答模型落地
  • 大模型应用开发极简入门:基于 GPT-4 和 ChatGPT

相关免费在线工具

  • 加密/解密文本

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