38. 报数

作者: 046ef6b0df68 | 来源:发表于2019-06-12 22:01 被阅读1次

    文|Seraph

    01 | 问题

    报数序列是一个整数序列,按照其中的整数的顺序进行报数,得到下一个数。其前五项如下:

    1、 1
    2、 11
    3、 21
    4、 1211
    5、 111221

    1 被读作 "one 1" ("一个一") , 即 11。
    11 被读作 "two 1s" ("两个一"), 即 21。
    21 被读作 "one 2", "one 1" ("一个二" , "一个一") , 即 1211。
    给定一个正整数 n(1 ≤ n ≤ 30),输出报数序列的第 n 项。
    注意:整数顺序将表示为一个字符串。

    示例 1:

    输入: 1
    输出: "1"

    示例 2:

    输入: 4
    输出: "1211"

    02 |解题

    初解:

    递归方法,可以看到没个数都是由前一个数推导过来的,终止条件为1,所以可以使用递归方法处理,如下:

    class Solution {
    public:
        string countAndSay(int n) {
            if(n==1)
                return "1";
            string str = countAndSay(n-1);
            string result="";
            int size = str.size();
            int i=0;
            int j=0;
            int iCount=0;
            while(j<size)
            {
                if(str[i]==str[j])
                {
                    iCount++;
                    j++;
                }
                else
                {
                    result += to_string(iCount);
                    result += str[i];
                    i=j;
                    iCount=0;
                }
    
            }
            result += to_string(iCount);
            result += str[i];
            return result;
        }
    };
    

    终解:

    使用全局的动态string数组,可以减少已查询过的项重复推导计算。

    vector<string> g_vcStr;
    
    class Solution {
    public:
        string countAndSay(int n) {
            if(g_vcStr.size()==n)
                return g_vcStr[n-1];
            
            if(n==1)
            {
                g_vcStr.push_back("1");
                return "1";
            }
            
            string str = countAndSay(n-1);
            string strResult="";
            int count=1;
            int i=0;
            for( ; i<str.size()-1; i++)
            {
                if(str[i]==str[i+1])
                {
                    count++;
                }
                else
                {
                    strResult += to_string(count);
                    strResult.push_back(str[i]);
                    count=1;
                }
            }
           
            strResult += to_string(count);;
            strResult += str[i]; 
    
            g_vcStr.push_back(strResult);
            return strResult;
        }
    };
    

    03 | 积累知识点

    1. to_string函数可以将数字转化成string类型。

    相关文章

      网友评论

        本文标题:38. 报数

        本文链接:https://www.haomeiwen.com/subject/gwnuyftx.html