Loading

LeetCode 38 外观数列

LeetCode38 外观数列

题目描述

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

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

  • countAndSay(1) = "1"

  • countAndSay(n) 是对 countAndSay(n-1) 的描述,然后转换成另一个数字字符串。

样例

1.     1
2.     11
3.     21
4.     1211
5.     111221
第一项是数字 1 
描述前一项,这个数是 1 即 “ 一 个 1 ”,记作 "11"
描述前一项,这个数是 11 即 “ 二 个 1 ” ,记作 "21"
描述前一项,这个数是 21 即 “ 一 个 2 + 一 个 1 ” ,记作 "1211"
描述前一项,这个数是 1211 即 “ 一 个 1 + 一 个 2 + 二 个 1 ” ,记作 "111221"

算法分析

模拟题:

  • 一开始状态"1",操作n-1次,
  • 给定一个字符串,计数
    • k = j,找到所有相等的数 最后执行k++, 所以总共有k-js.charAt(j)
    • 更新j = k

时间复杂度O(n)

Java代码

class Solution {
    public String countAndSay(int n) {
        StringBuilder ans = new StringBuilder("1");
        for(int i = 0; i < n-1; i++){
            StringBuilder t = new StringBuilder("");
            for(int j = 0; j < ans.length();){
                int k = j;
                while(k < ans.length() && ans.charAt(k) == ans.charAt(j)){
                    k++;
                }
                t.append(k-j).append(ans.charAt(j));
                j = k;
            }
            
            ans = t;
        }
        return ans.toString();
    }
}
posted @ 2020-11-03 14:13  想用包子换论文  阅读(79)  评论(0)    收藏  举报