报数序列是指一个整数序列,按照其中的整数的顺序进行报数,得到下一个数。其前五项如下:
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 ,输出报数序列的第 n 项。
注意:整数顺序将表示为一个字符串。
示例 1: 输入: 1 输出: "1"
示例 2:输入: 4 输出: "1211"
解题思路:
n=1,是1。
n=2,就是11。
.........
n=5,就是111221。
n=6,就是312211。
首先想到的就是,你给我一个字符串(里面是多个数字),然后我给你报数。报数给你的数,你可以继续给我,我接着给你报。
比如我给你一个数,8812,报数完,就是28 11 12。就是2个8、1个1、1个2。
基于这样的思考,我们就可以实现一个报数的方法。然后你需要报多少次数,就给个n,在外围多次调用即可。
code和详细注释如下:
public static String countAndSay(int n) {
String source = "1";
for (int i = 1; i < n; i++) {//第n项,就是报数n-1次
source = convert(source);
}
return source;
}
public static String convert(String str) {
char[] chars = str.toCharArray();
int charCount = 1;//字符数量默认至少为1
char charSymbol = chars[0];//第一个字符
StringBuilder resultBuilder = new StringBuilder();
for (int i = 1; i < chars.length; i++) {//i必须以1开始,因为charSymbol已经定位是第一个了,而且方便下一句code
if (chars[i] == chars[i - 1]) {//如果i从0开始,这里的判断条件就是i<chars.length-1,而且是char[i] == char [i+1]费劲
charCount++;//如果遍历的这个元素和charSymbol相同,就增加这个字符的统计量-报数
} else {
resultBuilder.append(charCount + "" + charSymbol);//记录存入结果集,n个charSymbol
//开始下一个字符的报数统计
charSymbol = chars[i];//更新目标charSymbol为当前的字符
charCount = 1;//重置字符 count统计为1
}
}
resultBuilder.append(charCount+""+charSymbol);//将最后的一个统计也加入到结果
return resultBuilder.toString();
}
public static void main(String[] args) {
int n = 5;
System.out.println("n="+n+", result = "+countAndSay(n));
}