LeetCode第38题 Count and Say
/*
The count-and-say sequence is the sequence of integers with the first five terms as following:
1. 1
2. 11
3. 21
4. 1211
5. 111221
1 is read off as "one 1"or 11.
11 is read off as "two 1s"or 21
21 is read off as "one 2, then one 1"or 1211
Given an integer n where 1 <=n<= 30, generate the nth term of the count-and-say sequence.
Note: Each term of the sequence of integers will be represented as a string
*/
import java.util.Scanner;
public class CountAndSay{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
CountAndSay cs = new CountAndSay();
String result = cs.countAndSay01(n);
System.out.println(result);
}
public String countAndSay(int n) {
int count = 0;
StringBuilder sb = new StringBuilder("1");
// 只要遍历n-1次
while(count < n-1){
// 获得当前遍历字符串,并清空StringBuffer
String init = sb.toString();
sb.setLength(0);
// 保存开端字符和索引
int preIndex = 0;
char preCharNum = init.charAt(0);
for (int i=1;i<init.length();i++){
// 通过preIndex计数
if(init.charAt(i) != preCharNum){
// 一旦数字发生变化,记录之前的情况
// Character.getNumericValue 字符转数字
// Integer.parseInt 字符串转数字
// String.valueOf 数字转字符串
// Character.toString 字符转字符串
sb.append("" + (i - preIndex) + preCharNum);
preIndex = i;
preCharNum = init.charAt(i);
}
}
sb.append("" + (init.length() - preIndex) + Character.toString(preCharNum));
count++;
}
return sb.toString();
}
public String countAndSay01(int n) {
int count = 0;
StringBuffer sb = new StringBuffer("1");
// 只要遍历n-1次
while(count < n-1){
// 获得当前遍历字符串,并清空StringBuffer
String init = sb.toString();
sb.setLength(0);
// 保存开端字符和索引
int preIndex = 0;
String preCharNum = Character.toString(init.charAt(0));
for (int i=1;i<init.length();i++){
// 通过preIndex计数
if(!Character.toString(init.charAt(i)).equals(preCharNum)){
// 一旦数字发生变化,记录之前的情况
sb.append("" + (i - preIndex) + preCharNum);
preIndex = i;
preCharNum = Character.toString(init.charAt(i));
}
}
sb.append("" + (init.length() - preIndex) + preCharNum);
count++;
}
return sb.toString();
}
}