LeetCode 38. 报数 Count and Say

作者: 1江春水 | 来源:发表于2019-08-20 16:05 被阅读2次

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

    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"
    

    【思路】
    1、看例子就想到递归可以解决此问题,因为第n个结果需要知道第n-1个结果,第n-1个结果需要知道第n-2个结果,以此类推
    2、必须有临界点,这儿的临界点是 1 = 1
    3、所以需要保留上一次的值,使用上一次的值计算当前的值
    4、时间复杂度O(n^2)
    5、空间复杂度O(1)

    代码实现:

    func countAndSay(_ n: Int) -> String {
        if n == 0 {
            return "1"
        }
        var res = "1"
        for _ in 1..<n {
            var tmp = ""
            var pre = Array(res)
            var count = 1
            for j in 0..<pre.count {
                if j+1 < pre.count && pre[j] == pre[j+1] {
                    count+=1
                } else {
                    tmp.append(String(count))
                    tmp.append(pre[j])
                    count = 1
                }
            }
            res = tmp
        }
        return res
    }
    

    相关文章

      网友评论

        本文标题:LeetCode 38. 报数 Count and Say

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