【leetcode】38-报数【C++】

题目如下:

解题思路:

首先需要理解题意,题目的意思是对序列前一个数进行报数:数列第一项为1;那第二项就报数第一项有一个1,输出11;然后第三项在第二项的基础上报数,报数两个1,输出21;第四项根据第三项报数为一个1和一个2,输出 1112;以此类推。

那么解决问题的核心思想就是,通过 递归调用 获取前一个序列,并对前一个序列按照上述规则进行遍历处理得到当前序列。

代码如下:

class Solution {
public:
    string countAndSay(int n) {
        if(n == 1) //n为1时直接返回“1”
            return "1";
        string str = countAndSay(n - 1); //递归调用,返回n-1对应的序列
        string res; //保存结果
        for(int i = 0; i < str.length(); ) //根据序列n-1给出对应的n对应的序列
        {
            int j = i + 1;
            while(str[j] == str[i] && j < str.length())
                ++j;
            int quantity = j - i; //计算序列n-1中连续相同数字的个数
            res.push_back(quantity + '0');
            res.push_back(str[i]);
            i = j;
        }
        return res;
    }
};


版权声明:本文为qq_34018840原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。