✍个人博客: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;
}