1084
外观数列是指具有以下特点的整数序列:
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
思路:这题跟之前做的压缩有点像详情见1078字符串压缩与解压
这里判断有一点不同,计数为1的时候不需要增加判断,和最后一位与前面不同的时候要再循环外判断计数是否为1.
代码:
package Test_PTA_1062to;
import test.S;
import java.util.Scanner;
public class PTA1084 {
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
String d=in.next();
int N=in.nextInt();
for(int i=0;i<N-1;i++) {//第N位就是进行N-1次变化
d=x(d);
}
System.out.println(d);
}
public static String x(String d){//变化的方法
char[] b=d.toCharArray();
StringBuilder sb=new StringBuilder();
char c = b[0];//设置b[0]为第一个比较字符
int index = 1;//用于计算字符数量初始为一个
for (int i = 1; i < b.length; i++) {
char now = b[i];//设置当前要比较的字符,为了看的方便
if (now==c) {//判断是否为相同字符
index++;//开始计数
if(i==b.length-1){
sb.append(c).append(index);
}
}else {
sb.append(c);
sb.append(index);
c = now; //将下一个字符作为比较字符
index = 1;//更新该字符出现的次数
}
}
if(index==1) {
sb.append(c).append(index);
}
return sb.toString();
}
}