报数count-and-say
文章目录
- 报数count-and-say
- 思考
- 代码
报数count-and-say
报数序列是一个整数序列,按照其中的整数的顺序进行报数,得到下一个数。其前五项如下:
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"
思考
题目的意思是说
这题真的是有些奇葩,或者是我奇葩,根本没看懂,看了好几个评论才看懂~
1
2 描述的是1,是一个1,也就是11
3 描述的是11,是两个1,也就是21
4 描述的是21,是一个2一个1,也就是12-11
5 描述的是1211, 是一个1,一个2,两个1,也就是11-12-21
6 描述的是111221,是三个1,两个2,一个1,也就是31-22-11
7 描述的是312211,是一个3一个1两个2两个1,也即是13-11-22-21
以此类推
代码
class Solution {
public String countAndSay(int n) {
if (n <= 0) {
return "";
}
String[] seq = new String[n];
seq[0] = "1";
for (int i = 1; i < n; i++) {
seq[i] = convert(seq[i - 1]);
}
return seq[n - 1];
}
public String convert(String str) {
StringBuilder ans = new StringBuilder();
int count = 1;
for (int i = 0; i < str.length(); i++) {
// 这一部分是"count", 记录连续出现x个y
if (i < str.length() - 1 && str.charAt(i) == str.charAt(i + 1)) {
count++;
} else {
// 这一部分是"say",将上面"count"的结果"xy"作为下一个数的一部分(若上面记录到2个1,就拼接"21")
ans.append(count).append(str.charAt(i));
count = 1;
}
}
return new String(ans);
}
}
参考资料