2521 字
约 8 分钟
6
LeetCode刷题Java版038.外观数列
无标签

LeetCode刷题Java版038.外观数列

作者:沉默王二
发布时间:2022-09-07T11:05:24.872+0800


038.外观数列

题意

给定一个正整数 n ,输出外观数列的第 n 项。

「外观数列」是一个整数序列,从数字 1 开始,序列中的每一项都是对前一项的描述。

还是不明白「外观数列」是什么鬼?

你可以将其视作是由递归公式定义的数字字符串序列:

  • 1 <= n <= 30

还是不明白「外观数列」是什么鬼?

我们用一个例子来说明:

比如数列113334422,我们可以描述成 两个一 三个三 两个四 两个二,然后再把这个描述转化成数字——也就是21334422。

这就是「外观数列」的意义。

难度

中等

示例

下面列出了countAnySay(n),n = 1-5的情况。

n = 1     countAnySay(n) = "1"

n = 3     countAnySay(n) = "21"n = 4     countAnySay(n) = "1211"n = 5     countAnySay(n) = "111221"

分析

这题最困难的地方就在于读懂题意,其实就是让我们对最开始1描述之后的结果,再描述n - 1次。

也就是一直重复 描述字符串 这个过程,并且记录描述的结果,作为下次要描述的字符串。

那么这样子我们只需要对每个字符统计出一共有多少个连续的即可。

实现方式很多,这里采用两个下标lef和rig的方式来实现,两个下标一开始都在同一个位置,如果一样,则向后移动rig下标,如果不一样,则停止,这时候lef处的字符有多少个,只需要rig - lef即可,然后再将lef下标直接移动到rig的位置即可。

class Solution {

        StringBuilder res = new StringBuilder();        int lef = 0,rig = 0;        while(rig < str.length()){            while(rig < str.length() && str.charAt(rig) == str.charAt(lef))                rig++;            res.append(rig - lef);            res.append(str.charAt(lef));            lef = rig;        }        return res.toString();    }    public String countAndSay(int n) {        if(n == 0)            return "";        String res = "1";        for(int i = 2;i <= n;i++)            res = func(res);        return res;    }}

速度也非常不错

但是还有一种取巧的方法,注意题目给出的数据范围1 <= n <= 30。

那么……

我们其实可以在本地把所有的答案都跑出来,然后 按“需”回答 即可,是的,也就是所谓的——打表。

            "","1",

"21","1211","111221","312211","13112221","1113213211","31131211131221","13211311123113112211","11131221133112132113212221","3113112221232112111312211312113211","1321132132111213122112311311222113111221131221",...

这样子确实可以非常快,但是我们观察一下countAndSay(i)的长度,虽然不是严格的单调递增,但是确实是有着递增的趋势,所以最终的代码长度会比较长,我也就没有再往后贴出来。

总结

本题主要考察对题目的阅读理解,以及对 递归调用 这一重要知识点的应用,只要能理解题意,本题就是一道切切实实的递归入门题。

力扣链接:https://leetcode.cn/problems/count-and-say/

一步一个脚印

不积跬步无以至千里,不积小流无以成江海。LeetCode - 100天从算法小白到卷王正式启动了,我们计划周一到周五至少每天更新一篇,周六周日更新一篇,目标 300 道 LeetCode 经典题。

PDF 版本目前只针对**二哥编程星球 的球友开放,如果你也想一起打卡学习算法的话,戳链接 **加入我们吧。

一个人可以走得很快,但一群人才能走得更远。二哥编程星球 (目前已有 760 多名球友加入)里面的每个球友都非常的友善,除了鼓励你,还会给你提出合理的建议,一起冲!

038.外观数列

题意

给定一个正整数 n ,输出外观数列的第 n 项。

「外观数列」是一个整数序列,从数字 1 开始,序列中的每一项都是对前一项的描述。

还是不明白「外观数列」是什么鬼?

你可以将其视作是由递归公式定义的数字字符串序列:

  • 1 <= n <= 30

还是不明白「外观数列」是什么鬼?

我们用一个例子来说明:

比如数列113334422,我们可以描述成 两个一 三个三 两个四 两个二,然后再把这个描述转化成数字——也就是21334422。

这就是「外观数列」的意义。

难度

中等

示例

下面列出了countAnySay(n),n = 1-5的情况。

n = 1     countAnySay(n) = "1"

n = 3     countAnySay(n) = "21"n = 4     countAnySay(n) = "1211"n = 5     countAnySay(n) = "111221"

分析

这题最困难的地方就在于读懂题意,其实就是让我们对最开始1描述之后的结果,再描述n - 1次。

也就是一直重复 描述字符串 这个过程,并且记录描述的结果,作为下次要描述的字符串。

那么这样子我们只需要对每个字符统计出一共有多少个连续的即可。

实现方式很多,这里采用两个下标lef和rig的方式来实现,两个下标一开始都在同一个位置,如果一样,则向后移动rig下标,如果不一样,则停止,这时候lef处的字符有多少个,只需要rig - lef即可,然后再将lef下标直接移动到rig的位置即可。

class Solution {

        StringBuilder res = new StringBuilder();        int lef = 0,rig = 0;        while(rig < str.length()){            while(rig < str.length() && str.charAt(rig) == str.charAt(lef))                rig++;            res.append(rig - lef);            res.append(str.charAt(lef));            lef = rig;        }        return res.toString();    }    public String countAndSay(int n) {        if(n == 0)            return "";        String res = "1";        for(int i = 2;i <= n;i++)            res = func(res);        return res;    }}

速度也非常不错

但是还有一种取巧的方法,注意题目给出的数据范围1 <= n <= 30。

那么……

我们其实可以在本地把所有的答案都跑出来,然后 按“需”回答 即可,是的,也就是所谓的——打表。

            "","1",

"21","1211","111221","312211","13112221","1113213211","31131211131221","13211311123113112211","11131221133112132113212221","3113112221232112111312211312113211","1321132132111213122112311311222113111221131221",...

这样子确实可以非常快,但是我们观察一下countAndSay(i)的长度,虽然不是严格的单调递增,但是确实是有着递增的趋势,所以最终的代码长度会比较长,我也就没有再往后贴出来。

总结

本题主要考察对题目的阅读理解,以及对 递归调用 这一重要知识点的应用,只要能理解题意,本题就是一道切切实实的递归入门题。

力扣链接:https://leetcode.cn/problems/count-and-say/

一步一个脚印

不积跬步无以至千里,不积小流无以成江海。LeetCode - 100天从算法小白到卷王正式启动了,我们计划周一到周五至少每天更新一篇,周六周日更新一篇,目标 300 道 LeetCode 经典题。

PDF 版本目前只针对**二哥编程星球 的球友开放,如果你也想一起打卡学习算法的话,戳链接 **加入我们吧。

一个人可以走得很快,但一群人才能走得更远。二哥编程星球 (目前已有 760 多名球友加入)里面的每个球友都非常的友善,除了鼓励你,还会给你提出合理的建议,一起冲!

038.外观数列

题意

给定一个正整数 n ,输出外观数列的第 n 项。

「外观数列」是一个整数序列,从数字 1 开始,序列中的每一项都是对前一项的描述。

还是不明白「外观数列」是什么鬼?

你可以将其视作是由递归公式定义的数字字符串序列:

  • 1 <= n <= 30

还是不明白「外观数列」是什么鬼?

我们用一个例子来说明:

比如数列113334422,我们可以描述成 两个一 三个三 两个四 两个二,然后再把这个描述转化成数字——也就是21334422。

这就是「外观数列」的意义。

难度

中等

示例

下面列出了countAnySay(n),n = 1-5的情况。

n = 1     countAnySay(n) = "1"

n = 3     countAnySay(n) = "21"n = 4     countAnySay(n) = "1211"n = 5     countAnySay(n) = "111221"

分析

这题最困难的地方就在于读懂题意,其实就是让我们对最开始1描述之后的结果,再描述n - 1次。

也就是一直重复 描述字符串 这个过程,并且记录描述的结果,作为下次要描述的字符串。

那么这样子我们只需要对每个字符统计出一共有多少个连续的即可。

实现方式很多,这里采用两个下标lef和rig的方式来实现,两个下标一开始都在同一个位置,如果一样,则向后移动rig下标,如果不一样,则停止,这时候lef处的字符有多少个,只需要rig - lef即可,然后再将lef下标直接移动到rig的位置即可。

class Solution {

        StringBuilder res = new StringBuilder();        int lef = 0,rig = 0;        while(rig < str.length()){            while(rig < str.length() && str.charAt(rig) == str.charAt(lef))                rig++;            res.append(rig - lef);            res.append(str.charAt(lef));            lef = rig;        }        return res.toString();    }    public String countAndSay(int n) {        if(n == 0)            return "";        String res = "1";        for(int i = 2;i <= n;i++)            res = func(res);        return res;    }}

速度也非常不错

但是还有一种取巧的方法,注意题目给出的数据范围1 <= n <= 30。

那么……

我们其实可以在本地把所有的答案都跑出来,然后 按“需”回答 即可,是的,也就是所谓的——打表。

            "","1",

"21","1211","111221","312211","13112221","1113213211","31131211131221","13211311123113112211","11131221133112132113212221","3113112221232112111312211312113211","1321132132111213122112311311222113111221131221",...

这样子确实可以非常快,但是我们观察一下countAndSay(i)的长度,虽然不是严格的单调递增,但是确实是有着递增的趋势,所以最终的代码长度会比较长,我也就没有再往后贴出来。

总结

本题主要考察对题目的阅读理解,以及对 递归调用 这一重要知识点的应用,只要能理解题意,本题就是一道切切实实的递归入门题。

力扣链接:https://leetcode.cn/problems/count-and-say/

一步一个脚印

不积跬步无以至千里,不积小流无以成江海。LeetCode - 100天从算法小白到卷王正式启动了,我们计划周一到周五至少每天更新一篇,周六周日更新一篇,目标 300 道 LeetCode 经典题。

PDF 版本目前只针对**二哥编程星球 的球友开放,如果你也想一起打卡学习算法的话,戳链接 **加入我们吧。

一个人可以走得很快,但一群人才能走得更远。二哥编程星球 (目前已有 760 多名球友加入)里面的每个球友都非常的友善,除了鼓励你,还会给你提出合理的建议,一起冲!

            知识星球
            
    
    
        
        扫码加入星球
        查看更多优质内容
    
    https://wx.zsxq.com/mweb/views/joingroup/join_group.html?group_id=15522885221412
LeetCode刷题Java版038.外观数列
https://clxhxhhr.top/posts/2502/
作者
clxstart
发布于
2026-09-19
许可协议
CC BY-NC-SA 4.0
评论
0 条
还没有评论,先写一条吧。