1140 Look-and-say Sequence
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 one D in the 1st number, and hence it is D1; the 2nd number consists of one D (corresponding to D1) and one 1 (corresponding to 11), therefore the 3rd number is D111; or since the 4th number is D113, it consists of one D, two 1’s, and one 3, so the next number must be D11231. This definition works for D = 1 as well. Now you are supposed to calculate the Nth number in a look-and-say sequence of a given digit D.
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 次。
所以可以发现,每项序列是根据其上一个序列的值中每个元素连续的个数来生成的。
思路
具体思路如下:
1.输入起始序列 num 以及需要输出的项数 n 。
2.模拟题目意思,用双指针来生成每项序列,p 指向当前元素,而 q 指向与 p 指向元素相同的连续的最后一个元素的下一个位置,这样 q-p 就是 p 指向元素连续的个数。
3.输出第计算出来的第 n 项序列。
代码
#include<bits/stdc++.h> 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; }