题目描述:
报数序列是一个整数序列,按照其中的整数的顺序进行报数,得到下一个数。其前五项如下:
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"
题目难度:简单
分析:
emmmm,刚开始我都没看懂题目,心想简单难度的都这样了吗?后来看懂了题目才明白是怎么一回事,也就是说下一个字符串是根据上一个字符串生成的,明白了这个很容易想到类似的斐波那契数列,也就明白了需要用到递归的方法求解。
代码如下:
class Solution { public String countAndSay(int n) { StringBuilder sb = new StringBuilder(); // 递归结束的条件 if (n == 1) { return "1"; } else { // 利用递归求出所有的字符串 String s = countAndSay(n - 1); // 定义临时变量用来确定每次要“读”的字符 char temp = s.charAt(0); // 用来记录连续的字符个数,也就是读作:两个一/二,中的“两” int count = 0; // 遍历当前字符串 for (int i = 0; i < s.length(); i++) { char c = s.charAt(i); // 如果两个字符相等,应该合并,读作:两个一/二 if (c == temp) { count++; } else { // 不等时就把个数和字符添加到结果集,同时初始化临时变量和个数 sb.append(String.valueOf(count)).append(temp); temp = c; count = 1; } } sb.append(String.valueOf(count)).append(temp); } return sb.toString(); } }
总结:
关于递归,一定要有一个结束条件,否则就会死循环了。