38. 外观数列

38. 外观数列

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

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

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

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

前五项如下:

1
"11"
11
"21"
21
1211"
1211
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"

 

提示:

  • 1 <= n <= 30

 

 

 

复制代码
class Solution {
public:
    string countAndSay(int n) {
        vector<string> strs;
        strs.push_back("1");
        for(int i = 1; i < n; i++)
        {
            string str = strs[i - 1];
            string temp = "";
            char pre = str[0];
            int k = 1;
            for(int j = 1; j < str.length(); j++)
            {
                if(str[j] != pre)
                {
                    temp += to_string(k) + pre;
                    pre = str[j], k = 1;
                }
                else
                    k++;
            }
            temp += to_string(k) + pre;
            strs.push_back(temp);
        }
        return strs[n - 1];

    }
};
复制代码

 

posted @   WTSRUVF  阅读(31)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
历史上的今天:
2018-08-11 Period UVALive - 3026(next数组)
2018-08-11 KMPnext数组自看
2018-08-11 Shortest Prefixes POJ - 2001(统计次数)
点击右上角即可分享
微信分享提示