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"

解答:

public static String countAndSay(int n) {
        String rs = "1";
        for (int i = 1; i < n; i++) {
            // 每次都需要将上次的结果最为下一次计算的输入
            rs = say(rs);
        }
        return rs;
    }

    private static String say(String input) {
        // 定义每个n对应的结果
        String out = "";
        // 算数
        int count = 0;
        // 字符定位
        char c = input.charAt(0);
        for (int i = 0; i < input.length(); i++) {
            // 计算相同字母累计次数
            if (c == input.charAt(i)) {
                count++;
            } else {
                // 遇到不同字母
                // 先拼接上个相同字符对应的结果
                out = out + count + c;
                // 要将count置为1,即使字符不重复,也有计数1
                count = 1;
                // 重新定位下一个字符
                c = input.charAt(i);
                // 【注意理解:递归使用上次的输出作为输入,直接拼接就可以;直接重新定位c即可,不需要substring】
            }
        }
        // 拼接最后相等/不想等字符的结果
        out = out + count + c;
        return out;
    }

注意:

1.递归使用上次的输出作为输入;
2.直接拼接结果就可以
3.直接重新定位c即可,不需要substring

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 题目报数序列是一个整数序列,按照其中的整数的顺序进行报数,得到下一个数。其前五项如下: 1 11 21 1211 ...
    HITZGD阅读 194评论 0 0
  • LeetCode 的算法题 PHP解法记录 报数序列是指一个整数序列,按照其中的整数的顺序进行报数,得到下一个数。...
    织毛衣的手阅读 366评论 0 0
  • 报数序列是指一个整数序列,按照其中的整数的顺序进行报数,得到下一个数。其前五项如下: 1 被读作 "one 1"...
    vbuer阅读 156评论 0 0
  • 38. 报数报数序列是一个整数序列,按照其中的整数的顺序进行报数,得到下一个数。其前五项如下:1 被读作 "on...
    杏仁小核桃阅读 368评论 0 2
  • 写文章是对自己思维的二度认知,是活着的灵魂对世界的依恋。
    魔幻达林阅读 67评论 0 1