- 题目地址:38. 外观数列
这题首先需要读懂题意,其实代码也不是很好写,我参考了很多很多代码,然后修改成现在这个样子。
这题看一下,把代码写对就好,不用深入研究。
参考代码:
public class Solution {
public String countAndSay(int n) {
if (n == 1) {
return "1";
}
// 加上一个结束标记,可以理解为「哨兵」,可以避免很多讨论
String preStr = countAndSay(n - 1) + "#";
char[] charArray = preStr.toCharArray();
int len = preStr.length();
StringBuilder stringBuilder = new StringBuilder();
int duplicateTimes = 1;
// 每一次看后一个数,如果一样,就累积
for (int i = 0; i < len - 1; i++) {
if (charArray[i] == charArray[i + 1]) {
duplicateTimes++;
} else {
// 根据规则:先数字,后字符
stringBuilder.append(duplicateTimes);
stringBuilder.append(charArray[i]);
// 下一轮 duplicateTimes 重新计算
duplicateTimes = 1;
}
}
return stringBuilder.toString();
}
}
说明:递归终止条件隐含在 for
循环里。