今天做这道!!

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

  2. 1

  3. 11

  4. 21

  5. 1211

  6. 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"。

  u1s1 第一眼读题没有看懂...看了好久本来打算放弃了..还好评论区有许多热心的小伙伴把题目的意思发表了出来X

  那么我就复制一下评论区小伙伴的精彩发言吧:
  题目的意思是对序列前一个数进行报数,数列第一项不是1吗,那第二项就报第一项的有1个1,输出11,然后第三项就在第二项的基础上报数,第二项是11,第三项不就是2个1么,然后输出21。。。

思路:
  因为博主菜的原因,看到题目毫无思路只能硬着头皮写还原代码,虽然也通过了...不过这里就不贴出来丢人了!题解中发现了一个超级超级超级好玩的解题方式,这里我也用该解题方法通过了测试!这次就记录一下这个好玩的解题方式吧!

以下是该题解链接:https://leetcode-cn.com/problems/count-and-say/solution/di-gui-by-zhaowenhai/

  

过程:
  就如我们熟悉的汉诺塔递归一样,我们也可以将这个题目进行递归解答,举个栗子!当我们要求n=11时的字符串时,我们需要n=10时的字符串,根据n=10时的字符串,我们就能很快的编写程序来完成对n=11时的字符串求解!那么,我们如何求n=10时的字符串呢!....那我们就需要n=9的字符串!根据n=9的字符串我们就可以轻松完成对n=10的字符串求解啦!....(好吧当我在说废话) 那么,以此类推,当我们需要n=2的字符串时,我们就需要对n=1时的字符串进行求解,而n=1的字符串我们知道!因为题目规定n=1时答案是1!也就是说,我们仅仅只需要编写一个递归方法,主要实现如何从n对n+1层的求解就可以了!这个函数需要一个String 入参,并且也会返回一个String!下面是详细代码,递归可能不好理解,理解不了建议笔书过程以供理解....
  

class Solution {
    public String countAndSay(int n) {
       if(n==1)
           return "1";
       return say(countAndSay(n-1));

    }
    public String say(String a){
        StringBuffer sb = new StringBuffer();
        int count=1;
        char num =a.charAt(0);
        for(int i=1;i<a.length();i++){
            if(a.charAt(i)!=num){
                sb.append(count);
                sb.append(num);
                num=a.charAt(i);
                count=1;
            }else{
                count++;
            }
        }
        sb.append(count);
        sb.append(num);
        return sb.toString();
    }
}