38. Count and Say

142 篇文章 0 订阅
问题描述

The count-and-say sequence is the sequence of integers with the first five terms as following:

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

1 is read off as "one 1" or 11.
11 is read off as "two 1s" or 21.
21 is read off as "one 2, then one 1" or 1211.
Given an integer n , generate the nth term of the count-and-say sequence.

Note: Each term of the sequence of integers will be represented as a string.
题目链接:38. Count and Say

Example 1:

Input: 1
Output: “1”

Example 2:

Input: 4
Output: “1211”


思路分析

很tricky的一道题,一开始没有领会题目的意思,到底这个数字串是怎么数。实际很简单,就是数有几个相同的数字。求下一个序列,从头遍历这个字符串,有多少字符相同就输出”count + string[i]”。要求第n个序列,就需要从”1”开始循环 n1 遍。

代码
class Solution {
public:
    string countAndSay(int n) {
        if (n == 0)
            return "";
        string result = "1";
        while (--n){ //very important, when n = 1, directly return result
            string cache = "";
            for(int i = 0; i < result.length(); i++){
                int count = 1;
                while(i+1 < result.length() && result[i] == result[i+1]){
                    count++;
                    i++;
                }
                cache = cache + to_string(count) + result[i];
            }
            result = cache;
        }
        return result;
    }

};

时间复杂度:O(n) //n为nums的元素个数。


反思

一开始看不懂题目,在参考了Discussion后才有这个答案。对于一个问题解决,我需要着重考虑的是边界条件(开始和结束时能否正常工作)、循环判断条件以及循环次数。考虑清楚这些东西之后才可以动手写代码。

在此基础上,有很多小技巧。比如”–n”的使用,可以自动减少一次循环;”i+1 < result.length()”在while循环中判断是否越界;”cache = cache + to_string(count) + result[i];”也可以写作”cache +=to_string(count) + result[i];”。自己还有很多提高的地方啊。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值