报数指的是,按照其中的整数的顺序进行报数,然后得到下一个数。如下所示:
1, 11, 21, 1211, 111221, ...
1
读作 "one 1"
-> 11
.
11
读作 "two 1s"
-> 21
.
21
读作 "one 2, then one 1"
-> 1211
.
给定一个整数 n
, 返回 第 n
个顺序
/**
思路:
依赖于之前的结果,得到之后的结果,所以,和“斐波那契数列”的做法一样,
我们可以用递归,也可以用迭代,考虑到效率因素,我们是用迭代的方法。
其实,就是这样一种形式,对前一个结果进行分析,把相邻的,
且相同的数计数(记为count),
然后把这个count的字符串形式和它所对应的值的字符串形式连接起来,
然后再分析之后的字符。
那样例中的“1211”来说,
前面的1,2都是单独的,所以是“11”(表示1个1),“12”(表示1个2),
最后两个1相邻,所以是“21”(2个1),
整个连起来,就是“111221”,也就是第五个结果。
*/
public class Solution {
public String countAndSay(int n) {
//开始就为1
String oldString = "1";
//for (int j = 1; j < n; ++j) {
while(--n>0){
StringBuilder sb = new StringBuilder();
//之前的数转换为字符串数组
char[] oldChars = oldString.toCharArray();
for(int i=0;i<oldChars.length;i++){
int count = 1;//把相邻的,而且相同的数计数
while((i)<oldChars.length-1 && oldChars[i]==oldChars[i+1]){
count++;
i++;
}
//当前后不相等就先加,下一个
sb.append(String.valueOf(count) + String.valueOf(oldChars[i]));
}
oldString = sb.toString();
}
return oldString;
}
}