T38、外观数列

「外观数列」是一个整数序列,从数字 1 开始,序列中的每一项都是对前一项的描述。前五项如下:
1: 1
2: 11
3: 21
4: 1211
5: 111221
1 被读作 "one 1" ("一个一") , 即 11。
11 被读作 "two 1s" ("两个一"), 即 21。
21 被读作 "one 2", "one 1" ("一个二" , "一个一") , 即 1211。
给定一个正整数 n(1 ≤ n ≤ 30),输出外观数列的第 n 项。

注意:整数序列中的每一项将表示为一个字符串。
示例 1:
输入: 1
输出: "1"
解释:这是一个基本样例。
示例 2:
输入: 4
输出: "1211"
解释:当 n = 3 时,序列是 "21",其中我们有 "2" 和 "1" 两组,"2" 可以读作 "12",也就是出现频次 = 1 而 值 = 2;类似 "1" 可以读作 "11"。所以答案是 "12" 和 "11" 组合在一起,也就是 "1211"。

输入为n时需要计算n次。第n次的结果由n-1次结果计算而来。维护一个栈s,当输入元素和栈顶元素不同时,则记录一条数据。

public static String countAndSay(int n) {
        StringBuilder sb = new StringBuilder();
        sb.append("1");
        for(int i=1;i<n;i++) {
            String temp = sb.toString();
            sb.delete(0, sb.length());
            Stack<Character> s = new Stack<>();
            for(int j=0;j<temp.length();j++) {  
                char ch = temp.charAt(j);
                if(s.isEmpty()||s.peek()==ch)
                    s.push(ch);
                else {
                    sb.append(s.size());
                    sb.append(s.peek());
                    s.clear();
                    s.push(ch);
                }
            }
            sb.append(s.size());
            sb.append(s.peek());
        }
        return sb.toString();
    }
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 前言 算法这个活动很严,每天必须打卡,而且不限制语言,群内已有PHP、Python、Java、Javascript...
    鸡汤小弟阅读 416评论 5 4
  • 在C语言中,五种基本数据类型存储空间长度的排列顺序是: A)char B)char=int<=float C)ch...
    夏天再来阅读 3,952评论 0 2
  • 1.把二元查找树转变成排序的双向链表 题目: 输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。 要求不...
    曲终人散Li阅读 3,484评论 0 19
  • 8月22日-----字符串相关 2-3 个性化消息: 将用户的姓名存到一个变量中,并向该用户显示一条消息。显示的消...
    future_d180阅读 1,024评论 0 1
  • 官网 中文版本 好的网站 Content-type: text/htmlBASH Section: User ...
    不排版阅读 4,682评论 0 5

友情链接更多精彩内容