Skip to main content

38. 外观数列 [easy]

38. 外观数列 [easy]

https://leetcode-cn.com/problems/count-and-say/

给定一个正整数 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"。

通过次数113,181 | 提交次数202,464

First Try

2020-07-24

又是一道看题意莫名其妙的题目,看懂后用递归直接暴力求解。

不过速度比较慢,没观察出诸如dp之类的优化方法。 看了其他题解,发现也没有其他优化。

class Solution:
def countAndSay(self, n: int) -> str:
# 表示为字符串已经暴露了一切
if n == 1:
return str(n)
carr = self.countAndSay(n - 1)
pt = 1
counts = 1
rv = ""
while pt < len(carr):
if carr[pt] != carr[pt-1]:
rv += str(counts) + carr[pt - 1]
counts = 1
else:
counts += 1
pt += 1
# 收尾注意下就行
rv += str(counts) + carr[pt - 1]
return rv
  • 执行用时:60 ms, 在所有 Python3 提交中击败了13.38%的用户
  • 内存消耗:13.7 MB, 在所有 Python3 提交中击败了6.67%的用户