LeetCode 38. Count and Say
报数序列是指一个整数照其中的整数的顺序按行报数,得到下一个数。其前五项如下:
-
1
-
11
-
21
-
1211
-
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”
解题思路:
依次递推后一项以前一项为基础
比如说6是在5的基础上得到,三个一,二个二,一个一
所以6的报数序列为:312211
代码:
package easy;
public class CountandSay {
public static void main(String[] args) {
// TODO Auto-generated method stub
int n=6;
System.out.println(CountandSay.countAndSay(n));
}
public static String countAndSay(int n) {
String result = "1";
if (n > 1) {
result = generateSeq(n);
}
return result;
}
public static String generateSeq(int n) {
int i = 1;
String result = "1";
//从1依次递推
while (i < n) {
//定义成StringBuilder,因为它可以改变
StringBuilder sb = new StringBuilder();
int count = 0;
for (int j = 0; j < result.length(); j++) {
char b = result.charAt(j);
count++;
//注意下面的两个判断不可调换顺序,否则会是越界错误
if (j + 1 < result.length()&&b != result.charAt(j+1)) {
sb.append(count);
sb.append(b);
count = 0;
}
//加入最后一个字符
else if (j == result.length()-1) {
sb.append(count);
sb.append(b);
}
}
result = sb.toString();
i++;
}
return result;
}
}