6.5 模拟专题:LeetCode 38. 外观数列

1. 题目链接

LeetCode 38. 外观数列


2. 题目描述

给定一个正整数 n,生成外观数列的第 n 项。外观数列的定义如下:

  • 1 项为 "1"
  • n 项是对第 n-1 项的描述。例如,第 2 项描述第 1 项("1")为 "11"(即“1个1”),第 3 项描述第 2 项("11")为 "21"(即“2个1”),依次类推。

示例

  • 输入:n = 4 → 输出:"1211"
  • 输入:n = 5 → 输出:"111221"

3. 示例分析
  1. 基础案例

    • n=1"1"
    • n=2"11"
    • n=3"21"
    • n=4"1211"(描述 "21" 为“1个2,1个1”)
    • n=5"111221"(描述 "1211" 为“1个1,1个2,2个1”)
  2. 复杂案例

    • n=6"312211"(描述 "111221" 为“3个1,2个2,1个1”)

4. 算法思路

核心思想迭代生成 + 双指针统计

  1. 初始化:从第 1"1" 开始迭代。
  2. 迭代生成:对当前项从左到右扫描,统计连续相同字符的数量。
  3. 双指针统计
    • left 指针标记当前字符的起始位置。
    • right 指针向右移动,直到遇到不同字符。
    • 统计长度 right - left,拼接成新字符串的 "数量+字符"
  4. 循环递推:重复上述过程 n-1 次,生成第 n 项。

时间复杂度

  • 外层循环 n-1 次,内层遍历字符串长度,总时间复杂度为 O(n·m),其中 m 为字符串的平均长度。

5. 边界条件与注意事项
  1. 输入范围
    • n ≥ 1,需处理 n=1 直接返回 "1"
  2. 字符串拼接优化
    • 使用 string+= 操作拼接字符,避免频繁创建新对象。
  3. 指针越界检查
    • 内层循环需确保 leftright 不超过字符串长度。
  4. 大数问题
    • n 较大时(如 n=30),生成的字符串长度可能超过 1e5,需注意内存限制。

6. 代码实现
class Solution {
public:string countAndSay(int n) {string ret = "1";for (int i = 1; i < n; i++) { // 迭代生成前n-1项string tmp; // 临时存储当前项的下一项描述int len = ret.size();for (int left = 0, right = 0; right < len;) {// 移动right指针,统计连续相同字符的数量while (right < len && ret[right] == ret[left]) right++;// 拼接"数量+字符"tmp += to_string(right - left) + ret[left];left = right; // 更新left指针到下一个字符的起始位置}ret = tmp; // 更新当前项}return ret;}
};

在这里插入图片描述


关键代码解析

  1. 外层循环控制迭代次数

    for (int i = 1; i < n; i++)
    
    • 从第 1 项开始,生成到第 n 项需要迭代 n-1 次。
  2. 双指针统计连续字符

    while (right < len && ret[right] == ret[left]) right++;
    
    • right 指针右移,直到遇到不同字符或越界。此时 right - left 即为连续字符的数量。
  3. 拼接描述字符串

    tmp += to_string(right - left) + ret[left];
    
    • 将数量转换为字符串,并与当前字符拼接。例如,连续 2'1' 拼接为 "21"
  4. 更新指针位置

    left = right;
    
    • left 移动到下一个待统计字符的起始位置。

与其他解法的对比

方法时间复杂度空间复杂度核心思想
递归法O(n·m)O(n·m)递归生成前一项,再描述
迭代法O(n·m)O(m)双指针遍历,直接构造
动态规划法O(n·m)O(m)存储中间结果,避免重复计算

总结

迭代法通过双指针高效统计连续字符,避免了递归的栈空间开销,是本题的最优解。其核心在于 逐层递推双指针滑动窗口,以线性时间复杂度生成外观数列。

适用场景

  • 需要快速生成较大 n 值的结果(如 n ≤ 30)。
  • 内存敏感场景,避免递归栈溢出。

关键点

  • 理解双指针在统计连续字符中的应用。
  • 掌握字符串拼接的优化技巧。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/73755.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

什么是具身智能

具身智能&#xff08;Embodied Intelligence&#xff09;是人工智能与机器人学交叉的前沿领域&#xff0c;强调智能体通过身体与环境的动态交互实现自主学习和进化&#xff0c;其核心在于将感知、行动与认知深度融合‌。通俗地讲&#xff0c;就是机器人或者智能系统在物理环境中…

git命令使用小记(打补丁)

需求&#xff1a;需要从开发分支提取本人提交代码&#xff0c;然后合并到主分支 一、制作补丁包 mkdir -p patches for commit in $(git log commitA..commitB --author"username" --reverse --prettyformat:"%h"); do …

mapbox基础,加载popup弹出窗

👨‍⚕️ 主页: gis分享者 👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍⚕️ 收录于专栏:mapbox 从入门到精通 文章目录 一、🍀前言1.1 ☘️mapboxgl.Map 地图对象1.2 ☘️mapboxgl.Map style属性1.3 ☘️popup 弹出窗 api1.3.1 ☘️构造函数1.…

C++11--(1)

目录 1.列表初始化 {}初始化 C98中 C11中 内置置类型和自定义类型 创建对象也适用 std::initializer_list 2.变量类型推导 auto C98 C11 decltype nullptr 3.范围for循环 4.STL中一些变化 array 1.创建和初始化 2.访问元素 ​编辑 3.修改操作 4.支持迭代器…

Promise的状态和方法是什么?

Promise 的状态和方法 1. Promise 的状态 一个 Promise 可以处于以下三种状态之一&#xff1a; - Pending&#xff08;待定&#xff09;&#xff1a;初始状态&#xff0c;表示异步操作正在进行中&#xff0c;Promise 还没有被解决或拒绝。 - Fulfilled&#xff08;已完成&…

Windows云服务器支持哪些数据库管理系统?

Windows云服务器因其良好的兼容性和企业级支持&#xff0c;广泛用于网站托管、企业管理系统、金融应用、数据分析等场景。在这些应用中&#xff0c;数据库管理系统(DBMS)起着至关重要的作用。Windows 服务器支持多种数据库&#xff0c;包括关系型数据库(SQL)和非关系型数据库(N…

MongoDB 实际工作中应用场景

博主介绍&#xff1a;✌全网粉丝5W&#xff0c;全栈开发工程师&#xff0c;从事多年软件开发&#xff0c;在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战&#xff0c;博主也曾写过优秀论文&#xff0c;查重率极低&#xff0c;在这方面有丰富的经验…

03 相机标定图像采集

学完本文,您将获取一下技能: 1:如何提升标定质量,如选择标定板,标定图像采集的注意事项, 2:实现标定图像自动筛选的代码 3:量产场景如何通过一张图像来标定相机 为了实现良好的标定效果,以下因素在标定数据采集前必须设置得当。 标定板选择 标定板尺寸准确材料平…

GitHub美化个人主页3D图表显示配置操作

这个功能主要是用的这个开源仓库&#xff1a;https://github.com/yoshi389111/github-profile-3d-contrib 想看效果的话&#xff0c;我的个人主页&#xff1a;https://github.com/Sjj1024 开始操作 1.创建自己的github主页属性项目——跟你github用户名一致即可&#xff0c;…

buu-jarvisoj_fm-好久不见52

格式化字符串漏洞题 x等于4x等于4​​​​​​​x等于4​​​​​​​x等于4 可以知道是第11个参数&#xff0c;%11$ 定位到这个位置&#xff0c;然后%n往这个位置写入4 1.先用pwndbg调试得到偏移量 2.查看获取x的地址 3.构造ROP链&#xff0c;发送连接 from pwn import *# …

AwesomeQt分享3(含源码)

AwesomeQt 这个项目包含了多个Qt组件的使用示例&#xff0c;旨在展示Qt各种强大功能的实现方式。 源码分享 github: awesome_Qtgitee: 后续同步 项目进度 QCustomPlot曲线控件示例 支持排序和筛选的列表控件示例 支持排序和筛选的表格控件示例 属性表示例 Dock窗口示例 自绘…

ubuntu 安装 g++

文章目录 前提一、安装 g1.1 安装1.2 验证 前提 安装 tflite_support 报错 error: subprocess-exited-with-error RuntimeError: Unsupported compiler -- at least C11 support is needed!一、安装 g 1.1 安装 # 安装编译工具链&#xff08;如g&#xff09;和依赖库 sudo …

【NLP 50、损失函数 KL散度】

目录 一、定义与公式 1.核心定义 2.数学公式 3.KL散度与交叉熵的关系 二、使用场景 1.生成模型与变分推断 2.知识蒸馏 3.模型评估与优化 4.信息论与编码优化 三、原理与特性 1.信息论视角 ​2.优化目标 3.​局限性 四、代码示例 代码运行流程 核心代码解析 抵达梦想靠的不是狂热…

使用QT画带有透明效果的图

分辨率&#xff1a;24X24 最大圆 代码: #include <QApplication> #include <QImage> #include <QPainter>int main(int argc, char *argv[]) {QImage image(QSize(24,24),QImage::Format_ARGB32);image.fill(QColor(0,0,0,0));QPainter paint(&image);…

【Unity网络编程知识】使用Socket实现简单TCP通讯

1、Socket的常用属性和方法 创建Socket TCP流套接字 Socket socketTcp new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 1.1 常用属性 1&#xff09;套接字的连接状态 socketTcp.Connected 2&#xff09;获取套接字的类型 socketTcp.So…

青少年编程与数学 02-013 初中数学知识点 02课题、概要

青少年编程与数学 02-013 初中数学知识点 02课题、概要 一、数与代数二、图形与几何三、统计与概率四、综合与实践五、课程理念与目标 根据2022年版义务教育数学课程标准&#xff0c;初中数学知识点可以总结为以下四大领域。 一、数与代数 数与式 有理数与实数&#xff1a;理解…

深入探索 libarchive

深入探索 libarchive&#xff1a;跨平台归档处理的终极解决方案 一、背景与历史沿革 1.1 归档处理的演进之路 从1979年tar格式的诞生到现代云存储时代&#xff0c;归档技术经历了四个关键阶段&#xff1a; Unix时代&#xff1a;tar/cpio主导系统备份互联网黎明期&#xff1…

2025最新“科研创新与智能化转型“暨AI智能体开发与大语言模型的本地化部署、优化技术实践

第一章、智能体(Agent)入门 1、智能体&#xff08;Agent&#xff09;概述&#xff08;什么是智能体&#xff1f;智能体的类型和应用场景、典型的智能体应用&#xff0c;如&#xff1a;Google Data Science Agent等&#xff09; 2、智能体&#xff08;Agent&#xff09;与大语…

Yolo_v8的安装测试

前言 如何安装Python版本的Yolo&#xff0c;有一段时间不用了&#xff0c;Yolo的版本也在不断地发展&#xff0c;所以重新安装了运行了一下&#xff0c;记录了下来&#xff0c;供参考。 一、搭建环境 1.1、创建Pycharm工程 首先创建好一个空白的工程&#xff0c;如下图&…

时尚界正在试图用AI,创造更多冲击力

数字艺术正以深度融合的方式&#xff0c;在时尚、游戏、影视等行业实现跨界合作&#xff0c;催生了多样化的商业模式&#xff0c;为创作者和品牌带来更多机会&#xff0c;数字艺术更是突破了传统艺术的限制&#xff0c;以趣味触达用户&#xff0c;尤其吸引了年轻一代的消费群体…