一、题目描述:
报数序列是一个整数序列,按照其中的整数的顺序进行报数,得到下一个数。其前五项如下:
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"
三、题意分析:
这个题题意有点不太好理解,如果理解了题意那么你再去做时会发现难度不大。这个题的意思是这样的:我输入一个数,你要把这个数读出来,并且把读出来的数显示出来,比如2—“11”读出来就是“两个1”,那么结果就是“21”,再比如3—“21”读出来就是“一个2一个1”,那么结果就是“1211”,你可能也发现了,如果我想得到3的答案,那么我就要去读2的答案,这就是解题的关键所在。
四、解题技巧:
如果我想得到n,那么我就要得去得到n-1,这样我才能在原来的基础上去读啊,所以,这个情形是不是类似于一个算法,叫递归。
五、代码
public String countAndSay(int n) {
String str = "1";
for (int i = 2; i <= n; i++) {
StringBuilder builder = new StringBuilder();
char pre = str.charAt(0);
int count = 1;
// 这个j的初始值设置的很巧妙奥
for (int j = 1; j < str.length(); j++) {
char c = str.charAt(j);
if (c == pre) {
count++;
} else {
builder.append(count).append(pre);
pre = c;
count = 1;
}
}
builder.append(count).append(pre);
str = builder.toString();
}
return str;
}