题目
报数序列是一个整数序列,按照其中的整数的顺序进行报数,得到下一个数。其前五项如下:
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”
解答
解法一:非递归解法
很简单,每次都找到在同一组的数字,计数即可。
代码
class Solution {
public String countAndSay(int n) {
if(n <= 1) return "1";
String res = "1";
for(int i = 2; i <= n; i ++) {
StringBuilder cur = new StringBuilder();
for(int j = 0; j < res.length(); j ++) {
int num = 1;
while(j < res.length() - 1 && res.charAt(j) == res.charAt(j + 1)) {
num ++;
j ++;
}
cur.append(num).append(res.charAt(j));
}
res = cur.toString();
}
return res;
}
}
结果
解法二:递归解法
解法一的递归版本。
代码
class Solution {
public String countAndSay(int n) {
if(n <= 1) return "1";
String pre = countAndSay(n - 1);
StringBuilder res = new StringBuilder();
for(int i = 0; i < pre.length(); i ++) {
int num = 1;
while(i < pre.length() - 1 && pre.charAt(i) == pre.charAt(i + 1)) {
num ++;
i ++;
}
res.append(num).append(pre.charAt(i));
}
return res.toString();
}
}