PAT(B) 1084 外观数列(Java)

题目链接:1084 外观数列 (20 point(s))

题目描述

外观数列是指具有以下特点的整数序列:

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

Java代码

/**********************************************************************************
Submit Time			Status		Score	Problem	Compiler		Run Time	User
8/1/2019, 13:04:39	Accepted	20		1084	Java (openjdk)	88 ms		wowpH
**********************************************************************************/
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;

public class Main {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		String[] dn = br.readLine().split(" ");
		int n = Integer.parseInt(dn[1]);			// 需要计算的项数

		char[] oldArr = dn[0].toCharArray();		// 上一项
		while ((--n) > 0) {							// 循环n-1次
			char[] newArr = new char[oldArr.length * 2];// 大小最多为2倍
			int length = 0;							// 当前项的字符个数
			newArr[length++] = oldArr[0];			// 至少有1个字符
			int number = 1;							// 当前字符的连续的个数,至少1个
			for (int i = 1; i < oldArr.length; ++i) {
				if (oldArr[i] == newArr[length - 1]) {// 第i个字符和当前字符相同
					++number;						// 当前字符个数加1
				} else {							// 不同
					newArr[length++] = (char) (number + 48);// 将个数添加到新数组中
					newArr[length++] = oldArr[i];	// 下一个字符
					number = 1;						// 初始连续的个数为1
				}
			}
			newArr[length++] = (char) (number + 48);// 最后1个的个数添加到新数组中
			oldArr = Arrays.copyOf(newArr, length);	// 拷贝新项到oldArr中
		}
		System.out.println(String.valueOf(oldArr));	// 转成字符串并输出
	}
}

提交结果

提交结果

posted @ 2019-08-01 13:19  wowpH  阅读(442)  评论(0编辑  收藏  举报