题目及用例
package pid038;
/*数数并说
报数序列是指一个整数序列,按照其中的整数的顺序进行报数,得到下一个数。其前五项如下:
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"
1
11
21
1211
111221
312211
13112221
1113213211
31131211131221
13211311123113112211
*/
public class main {
public static void main(String[] args) {
int [] testTable = {1,4,6,50,10};
for (int ito : testTable) {
test(ito);
}
}
private static void test(int ito) {
Solution solution = new Solution();
String rtn;
long begin = System.currentTimeMillis();
System.out.print(ito);
System.out.println();
//开始时打印数组
rtn= solution.countAndSay(ito);//执行程序
long end = System.currentTimeMillis();
System.out.println("rtn" );
System.out.print(rtn);
System.out.println();
System.out.println("耗时:" + (end - begin) + "ms");
System.out.println("-------------------");
}
}
注意:这道题的结果就是1推出11,11推出21,21推出1211,这个数字和12345没啥关系,只是一个递推的过程
解法一(成功,2ms,速度极快)
本来想寻找这个数的规律,但是感觉好像没什么规律,只能硬上
循环n次,每次查询下一个数,由于数可能很大,必须用string字符串作为参数和结果
在查询下一个数中,循环这个数的长度次,每次与上一个字符判断是否相同,相同,则num++,否则结果插入num和prev,为几个谁,然后prev和num重置。最后,i==length,则由于没有下一位进行比较,直接插入num,prev
package pid038;
import java.util.Arrays;
public class Solution {
public String countAndSay(int n) {
String result="1";
for(int i=1;i<n;i++){
result=nextCount(result);
}
return result;
}
public String nextCount(String s){
int length=s.length();
StringBuilder a=new StringBuilder();
int i=0;
int num=0;
char prev=' ';
char now;
while(true){
if(prev==' '){//第一次进入循环
prev=s.charAt(i);
num++;
}
else{//普通情况
now=s.charAt(i);
if(now==prev){//这个与上一个相同
num++;
}
else{//这个与上一个不同
a.append(num);
a.append(prev);//结果插入几个(num)谁(prev)
prev=now;
num=1;
}
}
i++;
if(i==length){//到了最后
a.append(num);
a.append(prev);
break;
}
}
return a.toString();
}
}
解法2(成功,4ms,很快)
做法和上面差不多,都是逐个递推即可
public String countAndSay(int n) {
if(n==1){
return "1";
}
String string="1";
for(int i=1;i<n;i++){
StringBuilder builder=new StringBuilder();
int num=1;
int digit=string.charAt(0)-'0';
for(int j=1;j<string.length();j++){
int now=string.charAt(j)-'0';
if(now==digit){
num++;
}
else{
builder.append(num).append(digit);
num=1;
digit=now;
}
}
builder.append(num).append(digit);
string=builder.toString();
}
return string;
}