Leetcode:38报数

一、题目描述:
报数序列是一个整数序列,按照其中的整数的顺序进行报数,得到下一个数。其前五项如下:

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"

三、题意分析:
  这个题题意有点不太好理解,如果理解了题意那么你再去做时会发现难度不大。这个题的意思是这样的:我输入一个数,你要把这个数读出来,并且把读出来的数显示出来,比如2—“11”读出来就是“两个1”,那么结果就是“21”,再比如3—“21”读出来就是“一个2一个1”,那么结果就是“1211”,你可能也发现了,如果我想得到3的答案,那么我就要去读2的答案,这就是解题的关键所在。
四、解题技巧:
  如果我想得到n,那么我就要得去得到n-1,这样我才能在原来的基础上去读啊,所以,这个情形是不是类似于一个算法,叫递归。

五、代码

public String countAndSay(int n) {
        String str = "1";
        for (int i = 2; i <= n; i++) {
            StringBuilder builder = new StringBuilder();
            char pre = str.charAt(0);
            int count = 1;
            // 这个j的初始值设置的很巧妙奥
            for (int j = 1; j < str.length(); j++) {
                char c = str.charAt(j);
                if (c == pre) {
                    count++;
                } else {
                    builder.append(count).append(pre);
                    pre = c;
                    count = 1;
                }
            }
            builder.append(count).append(pre);
            str = builder.toString();
        }

        return str;
    }

在这里插入图片描述

发布了123 篇原创文章 · 获赞 80 · 访问量 7万+

猜你喜欢

转载自blog.csdn.net/m0_38101105/article/details/98587866
今日推荐