版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/whitesun123/article/details/79999618
报数序列是指一个整数序列,按照其中的整数的顺序进行报数,得到下一个数。其前五项如下:
1. 1 2. 11 3. 21 4. 1211 5. 111221
给定一个正整数 n ,输出报数序列的第 n 项。
注意:整数顺序将表示为一个字符串。
解法一:乱糟糟版
public String countAndSay(int n) {
if( n == 1)
return "1";
StringBuffer start= new StringBuffer();
start.append("1");
int flag = 1;
StringBuffer result = new StringBuffer();
for(int i = 1; i < n; i++){
flag = 1;//1
result.delete(0, result.length());//2
for(int j = 0;j < start.length(); j++){//3
if( j+1 < start.length() && start.charAt(j) == start.charAt(j+1)){
flag++;
}
else{
result.append(flag);
result.append(start.charAt(j));
flag = 1;
}
}
start.delete(0, start.length());//4 start = result
System.err.println("result="+result);
for(int z = 0; z < result.length() ; z++){
start.append(result.charAt(z));
}
System.err.println("start="+start);
}
return result.toString();
}
解法二:优化版
public String countAndSay_2(int n) {
if( n == 1)
return "1";
String result = "1";
for(int i = 1; i < n; i++){
result = getString(result);
}
return result;
}
private String getString(String result) {
// TODO Auto-generated method stub
int flag = 1;
StringBuffer sb = new StringBuffer();
for(int i = 0; i< result.length(); ){
if(i +1 < result.length() && result.charAt(i) == result.charAt(i+1)){
flag++;
i++;
}
else{
sb.append(flag).append(result.charAt(i));
flag = 1;
i += flag;
}
}
System.out.println(sb);
return sb.toString();
}