LeetCode题库 38. 外观数列(简单)(StringBuiler)

LeetCode题库 38. 外观数列(简单)

原题


循环方法:

Low Level的字符串处理完成;
当n为奇数时,结果会因为结尾两个数字不同而不进入循环,所以需要追加执行把最后一位填上。
看了大佬们的讨论后,循环方法执行时间长是由于频繁定义和访问导致的。

class Solution {
    public String countAndSay(int n) {
        String res = "1"; 
        for(int i = 1; i < n ; ++i){
            String str = "";
            int t = 0;
            for(int j = 1; j < res.length(); ++j){
                if(res.charAt(j) != res.charAt(t)){
                    str += Integer.toString(j - t);
                    str += res.charAt(t);
                    t = j;
                }
            }
            str += (Integer.toString(res.length() - t) + res.charAt(t));
            res = str;
        }
        return res;
    }
}

递归方法:

这里贴出大佬解法。

class Solution {
    public String countAndSay(int n) {
        // 递归终止条件
        if (n == 1) {
            return "1";
        }
        // 获取到上一层的字符串
        String s = countAndSay(n - 1);
        StringBuilder result = new StringBuilder();
        // 记录每个数字的开始索引
        int start = 0;
        for (int i = 1; i < s.length(); i++) {
            // 当数字发生改变时执行
            if (s.charAt(i) != s.charAt(start)) {
                result.append(i - start).append(s.charAt(start));
                start = i;
            }
        }
        // 字符串最后一个数字
        result.append(s.length() - start).append(s.charAt(start));
        return result.toString();
    }
}

作者:zyxwmj
链接:https://leetcode-cn.com/problems/count-and-say/solution/xun-huan-he-di-gui-liang-chong-jie-fa-di-oof8/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

这里递归方法执行效率要比循环高。


笔记:

1. String类为不可变类,意思是在对String对象在修改时并不是对其本身进行修改,而是新建一个新对象并回收旧对象;
2. StringBuffer对象被建立后,提供的append()、insert()、reverse()、setCharAt()、setLength()等方法可以改变这个字符串对象的字符序列,StringBuffer对象是一个字符序列可变的字符串,它没有重新生成一个对象,而且在原来的对象中可以连接新的字符串;
3. StringBuilder类基本与StringBuffer类相似,区别是StringBuffer是线程安全的,而StringBuilder则放弃线程安全功能以提高性能。

参考:https://blog.csdn.net/csxypr/article/details/92378336

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值