✍个人博客:https://blog.csdn.net/Newin2020?spm=1011.2415.3001.5343
专栏地址:PAT题解集合
原题地址:题目详情 - 1140 Look-and-say Sequence (pintia.cn)
中文翻译:外观数列
专栏定位:为想考甲级PAT的小伙伴整理常考算法题解,祝大家都能取得满分!
❤️如果有收获的话,欢迎点赞收藏,您的支持就是我创作的最大动力
Look-and-say sequence is a sequence of integers as the following:
D, D1, D111, D113, D11231, D112213111, ...
where
D
is in [0, 9] except 1. The (n+1)st number is a kind of description of the nth number. For example, the 2nd number means that there is oneD
in the 1st number, and hence it isD1
; the 2nd number consists of oneD
(corresponding toD1
) and one 1 (corresponding to 11), therefore the 3rd number isD111
; or since the 4th number isD113
, it consists of oneD
, two 1’s, and one 3, so the next number must beD11231
. This definition works forD
= 1 as well. Now you are supposed to calculate the Nth number in a look-and-say sequence of a given digitD
.Input Specification:
Each input file contains one test case, which gives
D
(in [0, 9]) and a positive integer N (≤ 40), separated by a space.Output Specification:
Print in a line the Nth number in a look-and-say sequence of
D
.Sample Input:
1 8
Sample Output:
1123123111
给定一个 D
和 n
,按照 D
需要输出第 n
项外观序列,而外观序列的规则如下:
第 i
项序列要根据其前一项的序列生成,例如 D
等于 1
,则第 2
项为 11
,意思是前一项中 1
出现了 1
次;第 3
项为 12
,即其前一项中 1
出现了 2
次;第 3
项为 1121
,即其前一项中 1
出现了 1
次,2
出现了 1
次;第 4
项为 122111
,即其前一项 1
先连续出现了 2
次,接着2
出现了 1
次,然后 1
又出现了 1
次。
所以可以发现,每项序列是根据其上一个序列的值中每个元素连续的个数来生成的。
具体思路如下:
num
以及需要输出的项数 n
。p
指向当前元素,而 q
指向与 p
指向元素相同的连续的最后一个元素的下一个位置,这样 q-p
就是 p
指向元素连续的个数。n
项序列。#include
using namespace std;
int main()
{
string num;
int n;
cin >> num >> n;
//进行n-1次转换
for (int i = 1; i < n; i++)
{
int len = num.size();
int p = 0;
string str = "";
while (p < len)
{
int q = p + 1;
//找出连续相同的字段
while (q < len && num[q] == num[p]) q++;
str += num[p] + to_string(q - p);
p = q;
}
num = str;
}
//输出第n项序列
cout << num << endl;
return 0;
}