题目:外观数列 (20 分)
外观数列是指具有以下特点的整数序列:
d, d1, d111, d113, d11231, d112213111, …
它从不等于 1 的数字 d 开始,序列的第 n+1 项是对第 n 项的描述。比如第 2 项表示第 1 项有 1 个 d,所以就是 d1;第 2 项是 1 个 d(对应 d1)和 1 个 1(对应 11),所以第 3 项就是 d111。又比如第 4 项是 d113,其描述就是 1 个 d,2 个 1,1 个 3,所以下一项就是 d11231。当然这个定义对 d = 1 也成立。本题要求你推算任意给定数字 d 的外观数列的第 N 项。
输入格式:
输入第一行给出 [0,9] 范围内的一个整数 d、以及一个正整数 N(≤ 40),用空格分隔。
输出格式:
在一行中给出数字 d 的外观数列的第 N 项。
输入样例:
1 8输出样例:
1123123111
题目分析及实现
这个题目是有点绕的,一开始我理解成了出现的数字都算在一次中出现,然后很快就写出来发现不对,然后仔细看题目发现是
每个元素后面跟的统计,统计的是连续出现的次数
由这个例子分析
d11231, d112213111, 1总共出现了三次,但是第四个元素是2,最后又出现了两个1,意思是1出现了一个,则统计连续出现的相同的数字。
明白了思路实现过程有很多种,我这是比较笨的一种,是直接对字符串的操作。
//AC
import java.util.Scanner;public class Main {
public static void main(String []args) {
Scanner in = new Scanner(System.in);StringBuffer stringBuffer = new StringBuffer(in.next());StringBuffer stringBuffer2 =new StringBuffer("");int time = in.nextInt();in.close(); if(time==2)System.out.print(stringBuffer+"1");else if(time==1)System.out.print(stringBuffer);else {
stringBuffer.append(1);for(int i=2;i<time;i++) {
//第time个,抛开第一个输入值和前面处理的一个char one=stringBuffer.charAt(0);int count =1;for(int j=1;j<stringBuffer.length();j++) {
char temp=stringBuffer.charAt(j);//若相等且不到最后一位if(temp==one&&j!=stringBuffer.length()-1) count++;//若相等且到了最后一位else if (temp==one&&j==stringBuffer.length()-1) {
count++;stringBuffer2.append(one);stringBuffer2.append(count);}else {
//若不相等 stringBuffer2.append(one);stringBuffer2.append(count);if(j==stringBuffer.length()-1) {
//若不相等且到了最后一位stringBuffer2.append(temp);stringBuffer2.append(1);}one =temp;count=1;} }stringBuffer.replace(0, stringBuffer2.length(), stringBuffer2.toString());stringBuffer2.delete(0, stringBuffer2.length());}System.out.print(stringBuffer);}}
}
一开始忘了算N=1的时候,直接输出原数,有一个没过,加上后OK了