【PAT乙级】外观数列(奇葩的超时,以后字符串拼接要分开写)

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

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

思路

本来很简单的一道题,递归就出来了,但是最后一个测试点超时。我试了试,当等于 40 的时候,确实很慢。但是我找不到优化的地方了,貌似题目也没什么规律。上网看了看,他们的思路都和我的一样,甚至代码都差不多。但是有一个细微的区别:别人字字符串拼接是分开写的,而我是写到了一起。就因为这么一点差距,别人的 34 ms 就 AC了,而我不幸超时。

具体什么原理我也不太清楚,希望大家可以集思广益。

CODE

#include
#include
using namespace std;
string judge(string first,int index)
{
	if (index == 1)
		return first;
	int size = first.size();
	int num = 0; char c = first[0];
	string out;
	for (int i = 0; i < size; i++)
	{
		if (first[i]==c)
			num++;
		else
		{
			//out = out + c + to_string(num); //就是这里会超时,分开就不会了。
			out += c;
			out +=to_string(num);
			num = 1;
			c = first[i];
		}
	}
	out += c;
	out += to_string(num);
	return judge(out,index-1 );
}
int main()
{
	string a; int b;
	cin >> a >> b;
	cout << judge(a, b) << endl;
}

 

你可能感兴趣的:(PAT)