LeetCode T38_countAndSay

知识点:字符串+递归+循环

记录:对题目的理解,最初看到题目的时候并没有读懂题意,

1        1

2        11    //1(个)1

3        21   //2(个) 1

4        1211                //1(个)2  1(个)1

规律,第n个序列的字符串只与第 n-1个序列的字符串有关,因此用函数递归实现的方式如下:

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();i++ ) //根据序列n-1给出对应的n对应的序列
        {
            int j = i + 1; //j初始化为1
            while(str[j] == str[i] && j < str.length())//如果相等,统计连续相同数字的个数
                ++j;
            int quantity = j - i; //计算序列n-1中连续相同数字的个数
            res.push_back(quantity + '0');//+'0'
            res.push_back(str[i]);
            i = j;//更新i
        }
        return res;

    }
};

以上方法是学习别人的博客的,然而测试发现当n=4时结果错误。

以下用循环方法实现: 

class Solution {
public:
    string countAndSay(int n) {//返回一个字符串,接收参数为一个整形数
        string s = "1";//初始化返回字符串
        //循环的方法
        for (int i = 1; i < n; i++) {
            string tmp;//存储第i次的数字序列
            for (int j = 0; j < s.size(); j++) {
                int count = 1;
                while (j+1 < s.size() && s[j+1] == s[j]) { //统计重复
                    count++;//统计连续相等的数字的数目
                    j++; //相当于指针变量,遍历序列中的数字
                }
                tmp += to_string(count) + s[j]; //如果连续数字不相等,count即为1
            }
            s = tmp; //更新字符串
        }
        return s;

    }
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值