1084 外观数列 (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
【我的代码】
1// 1084 外观数列 (20 分)
2#include<iostream>
3using namespace std;
4int main()
5{
6 string a;
7 int n;
8 cin>>a>>n;
9 while(--n){
10 string ans;
11 char c=a[0];
12 int cnt=0;
13 for(int i=0;i<a.length();i++){
14 if(a[i]==c) cnt++;
15 else{
16 ans+=c;
17 ans+=cnt+'0';
18 c=a[i];
19 cnt=1;
20 }
21 }
22 if(cnt>0){
23 ans+=c;
24 ans+=cnt+'0';
25 }
26 a=ans;
27 }
28 cout<<a<<endl;
29 return 0;
30}
【思路】
本题的迷惑系数还是比较大的,第一感觉就是把d当作int类型数据处理,用数组计数,但是会发现,每次遍历的长度难以确定(通过样例可以知道,每次的并不是单调增长或者递减的),因此也困惑了比较久。
这里借鉴了网上的代码,把这个输入的d当作字符串处理就显得非常简单了!
每次都是顺序读取,统计前一个字符所出现的次数,将统计的结果拼接到该字符末尾。然后下一次计数从下一个其他字符开始。