力扣 题目38-- 外观数列

题目

38. 外观数列

给定一个正整数 n ,输出外观数列的第 n 项。

「外观数列」是一个整数序列,从数字 1 开始,序列中的每一项都是对前一项的描述。

你可以将其视作是由递归公式定义的数字字符串序列:

- countAndSay(1) = "1"
- countAndSay(n) 是对 countAndSay(n-1) 的描述,然后转换成另一个数字字符串。

前五项如下:

    1.     1
    2.     11
    3.     21
    4.     1211
    5.     111221
    第一项是数字 1 
    描述前一项,这个数是 1 即 “ 一 个 1 ”,记作 "11"
    描述前一项,这个数是 11 即 “ 二 个 1 ” ,记作 "21"
    描述前一项,这个数是 21 即 “ 一 个 2 + 一 个 1 ” ,记作 "1211"
    描述前一项,这个数是 1211 即 “ 一 个 1 + 一 个 2 + 二 个 1 ” ,记作 "111221"

要 描述 一个数字字符串,首先要将字符串分割为 最小 数量的组,每个组都由连续的最多 相同字符 组成。然后对于每个组,先描述字符的数量,然后描述字符,形成一个描述组。要将描述转换为数字字符串,先将每组中的字符数量用数字替换,再将所有描述组连接起来。

例如,数字字符串 "3322251" 的描述如下图:

示例 1:

    输入:n = 1
    输出:"1"
    解释:这是一个基本样例。

示例 2:

    输入:n = 4
    输出:"1211"
    解释:
    countAndSay(1) = "1"
    countAndSay(2) = 读 "1" = 一 个 1 = "11"
    countAndSay(3) = 读 "11" = 二 个 1 = "21"
    countAndSay(4) = 读 "21" = 一 个 2 + 一 个 1 = "12" + "11" = "1211"

题解


看了一下力扣评论区竟然有很多人没有看懂题目??那么这里我再说一下更容易理解的吧

n=1->1 ->这个不用管 

n=2->11=n-1->1->1个1->!1

n=3->21=n-1->11->2个1->21

n=4->1211=n-1->21->1个2 1个1->1211

其实就是某个数重复了几次 然后把次数和该数放在一起

既然和上一个数有关系那么是时候用递归

要知道n=30 就要知道n=29 那么就要知道n=28.....n=1 然后一步一步返回 具体看代码

代码

 1 #include<iostream>
 2 #include<string>
 3 #include<vector>
 4 using namespace std;
 5 class Solution {
 6 public:
 7     string countAndSay(int n) {
 8         //当n为1 直接返回字符1
 9         if (n == 1) {
10             //转换成string字符
11             return to_string(1);
12         }
13         //记录一下某个相同的数开始的位置
14         int record=0;
15         //故意多加一个- 这样考虑到遍历的最后一个的情况时就方便多了
16         string last = countAndSay(n-1)+"-";
17         string result="";
18         //遍历一下n=n-1时的外观数列
19         for (int i = 0; i < last.size(); i++) {
20             //如果为-即遍历到最后一个 直接退出循环
21             if (last[i] == '-') {
22                 break;
23             } 
24             //如果当前的数字和他的下一个位置数字不一样 则需要将数量和当前数字放入result
25             if (last[i] != last[i + 1]) {
26                 result = result+to_string(i - record + 1) + last[i];
27                 //新数字的开始位置
28                 record = i+1 ;
29             }
30         }
31         return result;
32     }
33 };
34 
35 int main() {
36     Solution sol;
37     int n = 30;
38     string result=sol.countAndSay(n);
39     cout << result << endl;
40 }
View Code

 

posted @ 2022-04-29 10:10  无聊的阿库娅  阅读(27)  评论(0编辑  收藏  举报