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

你可能感兴趣的:(38.报数)