LeetCode第38题 外观数列

在这里插入图片描述

第一反应

就这样依次往下递推。而且也没有“用前两项推测下一项”之类的,都是用上一行推测下一行。
看看有哪些特性
连续的数字,不管有连续的几个(也不一定,如果超过十个数呢?),都会变成两个数字表示(其实不一定,有可能超过连续十个数)
不对,是不是根本不可能有连续的超过十个数?如果不考虑前面有连续的超过十个数,最多连着3个数字一样,因为描述一项的两个数字的第二个数字是标识这串“连续数字”是什么,所以相邻的连续数字必定是不同的(否则就被视为同一串连续数字)所以,偶数个数字一定标识连续数字是什么,并且相邻的数字不同,并且只能是123,奇数个数字表示连续数字的个数,只能是123。
但是这些性质有什么用呢?是不是还是只能用模拟?
两个2是稳定的,两个2前面不会出现2,两个2之后有可能出现2
这样看来数列的尾数是比较好推测的,因为22可以作为分界线,22前面的内容不会影响22.
221->2211->2221->3211
算了,看来还是会被打破,并没有用
看看题解,有没有比直接模拟更好的方法
考虑到只有123三个数字,直接模拟开销也不大

题解

官方题解方法2带头打表,我是没想到的
评论区:“面向测试用例编程”
贴一个模拟的方法

class Solution {
    public String countAndSay(int n) {
        String str = "1";
        for (int i = 2; i <= n; ++i) {
            StringBuilder sb = new StringBuilder();
            int start = 0;
            int pos = 0;

            while (pos < str.length()) {
                while (pos < str.length() && str.charAt(pos) == str.charAt(start)) {
                    pos++;
                }
                sb.append(Integer.toString(pos - start)).append(str.charAt(start));
                start = pos;
            }
            str = sb.toString();
        }
        
        return str;
    }
}

作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/count-and-say/solution/wai-guan-shu-lie-by-leetcode-solution-9rt8/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值