当前位置: 首页 > news >正文

从递归到迭代的全方位解析——力扣38.外观数列(Count and Say)

在这里插入图片描述


【LeetCode】38. 外观数列(Count and Say)——从递归到迭代的全方位解析(Java详解)


一、题目描述

题目链接:LeetCode 38. Count and Say

“外观数列”(Count and Say)是一个特殊的数位字符串序列,定义如下:

countAndSay(1) = "1"
countAndSay(n) = 对 countAndSay(n - 1) 进行“行程长度编码(RLE)”得到。

其中,“行程长度编码”指将连续相同的数字用「出现次数 + 数字」的形式表示。

例如:

"3322251" → "23321511"

解释:

  • “33” → “23”
  • “222” → “32”
  • “5” → “15”
  • “1” → “11”

拼接结果即为 "23321511"


二、示例

示例 1:

输入:n = 4
输出:"1211"解释:
countAndSay(1) = "1"
countAndSay(2) = "11"    (一个 1)
countAndSay(3) = "21"    (两个 1)
countAndSay(4) = "1211"  (一个 2,一个 1)

示例 2:

输入:n = 1
输出:"1"

三、思路分析

1. 规律总结

外观数列是一种「读数描述」序列:

  • 第 1 项为 “1”
  • 每一项通过读出前一项的数字规律生成下一项

例如:

1 → 11 → 21 → 1211 → 111221 → 312211 → ...

2. 解法分类

可以使用两种方式求解:

  1. 递归法 —— 按定义直接递归生成。
  2. 迭代法 —— 从底向上逐步构造结果,更高效。

四、方法一:递归实现

思路

根据题目定义:

countAndSay(n) = 对 countAndSay(n - 1) 进行压缩编码

因此可以直接递归调用自身,当 n == 1 时返回 “1”。

Java 实现

public class Solution {public String countAndSay(int n) {// 基础情况if (n == 1) return "1";// 递归获得上一项String prev = countAndSay(n - 1);// 将上一项转换为本项StringBuilder sb = new StringBuilder();int count = 1;for (int i = 1; i <= prev.length(); i++) {if (i == prev.length() || prev.charAt(i) != prev.charAt(i - 1)) {sb.append(count).append(prev.charAt(i - 1));count = 1;} else {count++;}}return sb.toString();}
}

在这里插入图片描述

复杂度分析

  • 时间复杂度:O(n × m),其中 m 为字符串长度。
  • 空间复杂度:O(n),递归深度为 n。

五、方法二:迭代实现(推荐)

思路

  • 从 “1” 开始;
  • 每次根据前一项生成下一项;
  • 循环 n - 1 次即可。

Java 实现

public class Solution {public String countAndSay(int n) {if (n <= 0) return "";String result = "1";// 从第2项开始构造for (int i = 2; i <= n; i++) {result = getNext(result);}return result;}// 根据上一项字符串生成下一项private String getNext(String s) {StringBuilder sb = new StringBuilder();int count = 1;for (int i = 1; i <= s.length(); i++) {if (i == s.length() || s.charAt(i) != s.charAt(i - 1)) {sb.append(count).append(s.charAt(i - 1));count = 1;} else {count++;}}return sb.toString();}
}

在这里插入图片描述

优势

  • 无递归调用,逻辑更直观。
  • 适合 n 较大的情况(如 n = 30)。

六、方法三:字符数组优化(高性能版)

思路

在上一种迭代思路基础上,我们可以避免频繁 StringBuilder 拼接,通过预分配空间提升性能。

Java 实现

public class Solution {public String countAndSay(int n) {if (n <= 0) return "";String result = "1";for (int i = 2; i <= n; i++) {char[] chars = result.toCharArray();StringBuilder sb = new StringBuilder();int count = 1;for (int j = 1; j <= chars.length; j++) {if (j == chars.length || chars[j] != chars[j - 1]) {sb.append(count).append(chars[j - 1]);count = 1;} else {count++;}}result = sb.toString();}return result;}
}

在这里插入图片描述

该实现逻辑清晰、性能较优,适合面试中书写。


七、运行示例

输入 n输出
11
211
321
41211
5111221
6312211

八、总结

实现方式思想优点缺点
递归法按定义直接实现简单直观递归层数深,性能较差
迭代法从底向上生成高效、可控代码稍长
数组优化字符遍历优化性能最好实现最复杂

推荐优先使用迭代实现,逻辑清晰且无栈风险。


http://www.dtcms.com/a/470169.html

相关文章:

  • 深度学习(DL)概念及实例操作
  • 基于单片机的四点位水位控制与报警系统设计
  • 如何将Python脚本输出(含错误)全量保存到日志文件?实战指南
  • 3d网页游戏排行做360手机网站优化
  • Unreal Engine 中的旋转表示:FQuat 与 FRotator 全面解析
  • 设计模式-解释器模式
  • 望牛墩镇仿做网站泰州建设网站
  • 网站建设与网页制作基础入门教程祥云平台官方网站
  • Unreal Engine C++ 开发核心:USceneComponent 常用方法详解
  • 陪诊陪护小程序前端功能解析:就医照料的便捷对接与全流程保障
  • 在线PhotoShop网页版常用快捷键和实用技巧
  • 湖南建设网站公司h5四合一网站建设
  • (一)黑马React(项目初始化/字体和样式/列表循环/高亮排序/自定义hooks/异步RTK)
  • 酒泉网站建设有限公司自己怎样做公司广告视频网站
  • 基于Python的旅游数据可视化系统的分析与设计-计算机毕设 97740
  • PHP MySQL 使用 ORDER BY 排序查询
  • QT中加载PSQL驱动
  • 杭电 神经网络与深度学习 学习笔记
  • 网站建设合优企业做国外网站多少钱
  • 网站建设 主要学是么服装详情页设计
  • 自适应编码调制简介
  • MySQL实战篇05:MySQL主从复制Docker实战(上)——1主2从集群搭建与问题解决
  • 金融网站建设方案ppt模板重庆建设厅官网
  • 从源码优化外卖配送系统:算法调度、智能推荐与数据分析应用
  • 百宝图建设工程电子网站网络公司如何建网站
  • vscode 远程管理docker时,提示权限不足无法获取容器列表问题
  • 定制营销型网站什么意思wordpress建立移动m站
  • 石家庄无极网站建设网站开发实战项目
  • AI智能体(Agent)大模型入门【12】--基于llamaindex框架,fastapi框架实现大模型聊天基于mysql存储的历史对话进行聊天
  • 射频噪声干扰、调频调幅干扰仿真及SAR成像实现