算法43,外观数列,模拟算法+双指针

题目:38. 外观数列(Count and Say)

题目描述:

外观数列是一个整数序列,从数字 1 开始。后续每一项都是对前一项的描述(报数)。

  • n = 1 时,输出 "1"
  • n = 2 时,描述前一项 "1"(1个1),输出 "11"
  • n = 3 时,描述前一项 "11"(2个1),输出 "21"
  • n = 4 时,描述前一项 "21"(1个2,1个1),输出 "1211"

算法原理

  1. 外层循环(迭代生成) :从 i = 1 开始遍历到 n-1,每次根据当前的字符串 ret 生成下一项。
  2. 内层双指针(统计连续字符) :
    • 使用 left 和 right 两个指针。
    • right 不断向右移动,直到遇到与 left 不同的字符或到达字符串末尾。
    • 此时 right - left 就是连续相同字符的个数。
    • 将个数 和字符 依次追加到临时容器中,然后让 left = right,继续下一组统计。
  3. 类型转换 :利用 StringBuilder 高效拼接字符串,生成新项后转为 String 赋值给 ret。

解题模拟(以 n = 4 为例)

步骤 当前 ret 值 双指针统计过程 生成的 tmp 值
初始 "1" - -
i=1 "1" 统计到 1 个 '1' "11"
i=2 "11" 统计到 2 个 '1' "21"
i=3 "21" 统计到 1 个 '2',1 个 '1' "1211"
结束 "1211" 返回结果 -

代码答案

复制代码
class Solution {
    public String countAndSay(int n) {
        String ret = "1";
        for (int i = 1; i < n; i++) {
            StringBuilder tmp = new StringBuilder();
            int len = ret.length();
            for (int left = 0, right = 0; right < len; ) {
                // 重点:right < len 必须放在前面防止越界
                while (right < len && ret.charAt(left) == ret.charAt(right)) {
                    right++;
                }
                tmp.append(Integer.toString(right - left)); // 追加数量
                tmp.append(ret.charAt(left));             // 追加字符
                left = right;
            }
            ret = tmp.toString(); // StringBuilder 转为 String
        }
        return ret;
    }
}

知识点总结:String、StringBuilder 与数组对比

特性维度 数组 (Array) String (字符串) StringBuilder (可变字符串)
可变性​ 可变(修改元素原地生效) 不可变(修改会生成新对象) 可变(原地修改,性能好)
取值方式​ arr[index] charAt(index) 无直接下标取值法
长度获取​ arr.length (属性) str.length() (方法) sb.length() (方法)
追加/修改​ arr[index] = val 不能用 + 频繁拼接 append(数据) 追加到末尾
类型转换​ - Integer.toString(数字) sb.toString() 转为 String
适用场景​ 固定长度数据存储 最终稳定结果、只读场景 循环内频繁拼接/修改字符串

核心避坑指南:

  1. while 循环判断边界时,right < len 必须写在前面 (利用 Java 的短路与 && 特性),否则会触发 StringIndexOutOfBoundsException。
  2. String 和 StringBuilder 类型不兼容,赋值时必须用 toString() 显式转换。
相关推荐
2601_961133285 分钟前
盘立方软件指标文华期货公式下载
java
蜗牛互联网12 分钟前
长任务多Agent共享文件系统的Manifest交接模式
java·人工智能·后端
Sirens.34 分钟前
Java并发锁详解:六类锁策略与 synchronized 底层原理
java·前端·算法
和裕1 小时前
全纸结构重型纸箱能否满足 1 吨以上设备出口熏蒸豁免要求?通关合规性全解析
大数据·运维·网络·人工智能·算法
sunshine22 girl1 小时前
Java学习五 面向对象高级5 内部类1
java·学习
tangguofeng1 小时前
不带头结点的链队操作集(不含InitFlag)(C语言版)
算法
苏打豆3 小时前
CRISP源码阅读——基于ROS2力矩反馈控制器与速度加速度零空间
c++·线性代数·算法·矩阵·机器人
用户1305180712153 小时前
JDBC学习DAY2:从Statement到PreparedStatement
java
蛋蛋的就会顺顺的3 小时前
hot100——矩阵
java·数据结构·算法·leetcode·力扣
老歌老听老掉牙3 小时前
麻花钻切屑形态演变的力学机制与临界条件分析
python·算法·钻头