LeetCode 38. 外观数列 Count and Say

Table of Contents

一、中文版

二、英文版

三、My answer

四、解题报告


一、中文版

给定一个正整数 n(1 ≤ n ≤ 30),输出外观数列的第 n 项。

注意:整数序列中的每一项将表示为一个字符串。

「外观数列」是一个整数序列,从数字 1 开始,序列中的每一项都是对前一项的描述。前五项如下:

1.     1
2.     11
3.     21
4.     1211
5.     111221
第一项是数字 1

描述前一项,这个数是 1 即 “一个 1 ”,记作 11

描述前一项,这个数是 11 即 “两个 1 ” ,记作 21

描述前一项,这个数是 21 即 “一个 2 一个 1 ” ,记作 1211

描述前一项,这个数是 1211 即 “一个 1 一个 2 两个 1 ” ,记作 111221

 

示例 1:

输入: 1
输出: "1"
解释:这是一个基本样例。
示例 2:

输入: 4
输出: "1211"
解释:当 n = 3 时,序列是 "21",其中我们有 "2" 和 "1" 两组,"2" 可以读作 "12",也就是出现频次 = 1 而 值 = 2;类似 "1" 可以读作 "11"。所以答案是 "12" 和 "11" 组合在一起,也就是 "1211"。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/count-and-say
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

二、英文版

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 where 1 ≤ n ≤ 30, generate the nth term of the count-and-say sequence. You can do so recursively, in other words from the previous member read off the digits, counting the number of digits in groups of the same digit.

Note: Each term of the sequence of integers will be represented as a string.

 

Example 1:

Input: 1
Output: "1"
Explanation: This is the base case.
Example 2:

Input: 4
Output: "1211"
Explanation: For n = 3 the term was "21" in which we have two groups "2" and "1", "2" can be read as "12" which means frequency = 1 and value = 2, the same way "1" is read as "11", so the answer is the concatenation of "12" and "11" which is "1211".

 

三、My answer

class Solution:
    def countAndSay(self, n: int) -> str:
        nums = ['','1']
        if n == 1:
            return '1'
        for i in range(2, n+1):
            p = []
            s = ''
            for x in nums[i-1]:
                if p == [] or x == p[0]:
                    p.append(x)
                else:
                    s += str(len(p))
                    s += p[0]
                    p = []
                    p.append(x)
                    
            s += str(len(p))
            s += p[0]
            nums.append(s)
        
        return nums[-1]

四、解题报告

数据结构:数组

算法:遍历

实现:遍历 2 到 n 之间的每一个中间结果,存入 nums 中,这样题目要求的结果就是 nums[-1]。

nums 中先存入初始值,也就是第一个 n = 1 的结果。

数组 p 用来存每一次相同元素,这样 p 的长度就是里面元素出现的个数。

如果 p 为空或者字符 x 与第一个 p[0] 值相同,说明从开始到该字母 x 一直没变,则把 x 存入 p 中。

当字母 x 与 数组 p 中元素不一样时,说明字符变化,则需要把数据 p 中现有元素及个数存入字符串 s 中。最后 s 再放入 nums 数组中。注意 s 和 p 的重新清零的位置。 

你可能感兴趣的:(LeetCode\,LintCode,每周一题坑男友系列)