38. 外观数列[C++,模拟]

向右看齐 2022-09-16 04:52 279阅读 0赞

给定一个正整数 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” 的描述如下图:

aa6c88f908f021cb15da073ad75ce45c.png

示例 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”

提示:

1 <= n <= 30

  1. class Solution {
  2. public:
  3. string countAndSay(int n) {
  4. string ret = "1";
  5. while(--n)
  6. {
  7. string t="";
  8. for(int i=0;i<ret.size();i++)
  9. {
  10. int cnt = 1;
  11. while(i+1<ret.size()&&ret[i]==ret[i+1]) i++,cnt++;
  12. t+=to_string(cnt)+ret[i];
  13. }
  14. ret = t;
  15. }
  16. return ret;
  17. }
  18. };

发表评论

表情:
评论列表 (有 0 条评论,279人围观)

还没有评论,来说两句吧...

相关阅读

    相关 38. 外观数列

    打卡!!!每日一题 今天给大家带来一道比较有意思的题目,先看看题目描述 题目描述: ![在这里插入图片描述][82dc3a8d28064fa79835d3bb5c71f

    相关 38. 外观数列[C++,模拟]

    给定一个正整数 n ,输出外观数列的第 n 项。 「外观数列」是一个整数序列,从数字 1 开始,序列中的每一项都是对前一项的描述。 你可以将其视作是由递归公式定义的数字字符