题目描述:
报数序列是一个整数序列,按照其中的整数的顺序进行报数,得到下一个数。其前五项如下:
1
11
21
1211
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