计数和数数(伯爵说”序列如下:1, 11, 21)
在计蒜客中遇到一个这样的题目:
伯爵说”序列如下:1, 11, 21, 1211, 111221, ...1 读作 "one 1" 或者 11。11 读作 "two 1s" 或者21。21 读作 "one 2, one 1" 或者 1211。
格式:多组输入,读到文件结束。每组输入给定一个整数n,输出第n个序列。(1<=n<=30)
注意:整数序列以字符串的形式表示。
样例
输入:
6
输出:
312211
我的思路是根据数数的方式,由前一个数得到后一个数,但是代码测试没有通过,但是已经实现能够输出,但是第30个数及其以后的数就不能显示了,不知道是为什么?
代码如下:
1 import java.util.Scanner; 2 public class Main { 3 /** 4 * @param args 5 */ 6 public static void main(String[] args) { 7 int number; 8 Scanner read=new Scanner(System.in); 9 number=read.nextInt(); 10 String[] array=new String[number]; 11 switch(number){ 12 case 1: 13 array[0]="1"; 14 break; 15 case 2: 16 array[0]="1"; 17 array[1]="11"; 18 break; 19 default: 20 array[0]="1"; 21 array[1]="11"; 22 String result=""; 23 for(int i=2;i<number;i++){ 24 String last=array[i-1]; //得到上一个数 25 int count=1; 26 int j=0; 27 for(j=0;j<last.length()-1;j++){ //对上一个数每一个数字分析 28 if(last.charAt(j)==last.charAt(j+1)){ //如果该数字与后一个数字相同,则计数加一 29 count++; 30 } 31 else { //如果不同,则说明该数字已经是与下一个数字不同的边界,则把获得的计数和该边界数字组合写入result结果 32 result+=String.valueOf(count)+last.charAt(j); 33 count=1; 34 if(j==last.length()-2 && last.charAt(j)!=last.charAt(j+1)){ //特殊情形,当面临倒数第二个数字时,判断最后一个数字与倒数第二个数字是否相同 35 result+="1"+last.charAt(j+1); //比如数111221,当运行到倒数第二位时,2与1不同,而恰恰此时为循环的最后一次,不能运行到最后一个数字,所以此时将最后一个数字的写入结果 36 } 37 } 38 } 39 if(count!=1){ 40 result+=String.valueOf(count)+last.charAt(j); //对特殊处理,如1211,最后两位在循环结束时来不及写入结果而跳出循环,对count判断,如果大于1,则写入结果 41 } 42 array[i]=result; 43 result=""; 44 45 } 46 } 47 System.out.println(array[number-1]); 48 } 49 }
运行结果:
而测试数据30时,没有显示。
jeyfang