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

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

Z 字形变换通过观察下标周期性规律,将字符串按行排列后重组,关键在于确定周期为 2*numRows-2,分首尾行和中间行处理。外观数列则利用双指针模拟计数过程,迭代生成下一项序列。两者均体现模拟思想,适合巩固基础逻辑与边界条件处理。

女王发布于 2026/3/15更新于 2026/5/57 浏览
算法实战:Z 字形变换与外观数列的模拟解法

41. Z 字形变换

题目链接:

6. Z 字形变换 - LeetCode

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

解法(模拟 + 找规律)

思路分析

观察 N 字形排列,可以发现下标变化具有周期性。当行数为 numRows 时,周期长度为 2 * numRows - 2。

第一行和最后一行的字符间隔固定为周期长度。中间行的字符则分为两部分:一部分向下移动,另一部分向上移动,两者间隔互补。

具体策略如下:

  1. 单独处理第一行和最后一行。
  2. 中间行需要同时考虑向下和向上的索引位置。
实现代码
class Solution {
public:
    string convert(string s, int numRows) {
        if (numRows == 1) return s;
        string ret;
        int d = 2 * numRows - 2, 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];
            }
        }
        
        // 处理最后一行
        for (int i = numRows - 1; i < n; i += d) ret += s[i];
        
        return ret;
    }
};

42. 外观数列

题目链接:

38. 外观数列 - LeetCode

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

解法(模拟)

思路分析

外观数列的核心在于'读'出前一项的数字特征。每一项都是对前一项连续相同字符的描述:先说个数,再说数字本身。

例如:1 -> 11 (1 个 1) -> 21 (2 个 1) -> 1211 (1 个 2,1 个 1)。

我们可以使用双指针来遍历当前字符串,统计连续相同字符的段长,拼接成下一项。迭代 n-1 次即可得到结果。

实现代码
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 字形变换的关键在于数学规律的抽象,而外观数列则考察字符串处理的细节控制。掌握这类模拟技巧,有助于解决更多涉及状态流转的问题。

目录

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

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

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

更多推荐文章

查看全部
  • GitHub Copilot 网络代理配置与优化实战
  • C++ 入门:引用、内联函数与 C++11 新特性详解
  • Buzz 离线语音转文字工具:基于 Whisper 的本地部署指南
  • Linux 部署 RocketMQ 及公网穿透实战
  • Python 数据分析实战指南:从数据清洗到可视化报告
  • Windows 系统 Git 安装与配置实战指南
  • 基于 KWDB 的运维监控实战:SQL 融合指标与 CMDB 数据
  • Qwen3-32B 本地部署实践:Clawdbot CLI 与 Web UI 双入口
  • 2026 年 3 月全球 AI 前沿动态与技术综述
  • Python 爬虫入门:从原理到实战解析
  • Android 基于 WebRTC 的高清语音通话实现与性能优化
  • 人工智能与机器学习如何重塑软件工程开发流程
  • Spring Web MVC 从入门到实战
  • SketchUp STL 插件使用指南:设计与 3D 打印流程
  • Vue3 前端面试核心 20 题详解(含代码实战)
  • STM32H743 与 STM32F407 串口通信配置与优化实践
  • 扩散模型原理与图像生成实战:DDPM 核心解析与 PyTorch 实现
  • 鸿蒙 APP 开发:性能优化与 Next 原生合规
  • Transformer 时序数据建模与实现详解
  • 二分算法实战:查找元素首尾位置与区间查询

相关免费在线工具

  • 加密/解密文本

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