算法题:外观数列

心已赠人 2022-12-28 15:26 196阅读 0赞

外观数列

  • 题目描述
  • 示例
  • 代码
  • 执行效率

题目描述

给定一个正整数 n ,输出外观数列的第 n 项。

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

可将其视作是由递归公式定义的数字字符串序列:

countAndSay(1) = “1”
countAndSay(n) 是对 countAndSay(n-1) 的描述,然后转换成另一个数字字符串。
前五项如下:

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

第一项是数字 1
描述前一项,这个数是 1 即 “ 一 个 1 ”,记作 “11”
描述前一项,这个数是 11 即 “ 二 个 1 ” ,记作 “21”
描述前一项,这个数是 21 即 “ 一 个 2 + 一 个 1 ” ,记作 “1211”
描述前一项,这个数是 1211 即 “ 一 个 1 + 一 个 2 + 二 个 1 ” ,记作 “111221”
要 描述 一个数字字符串,首先要将字符串分割为 最小 数量的组,每个组都由连续的最多 相同字符 组成。然后对于每个组,先描述字符的数量,然后描述字符,形成一个描述组。要将描述转换为数字字符串,先将每组中的字符数量用数字替换,再将所有描述组连接起来。

例如,数字字符串 “3322251” 的描述如下图:

在这里插入图片描述

示例

示例 1:
输入:n = 1
输出:“1”
解释:这是一个基本样例。

示例 2:
输入:n = 4
输出:“1211”
解释:
countAndSay(1) = “1”
countAndSay(2) = 读 “1” = 一 个 1 = “11”
countAndSay(3) = 读 “11” = 二 个 1 = “21”
countAndSay(4) = 读 “21” = 一 个 2 + 一 个 1 = “12” + “11” = “1211”

提示:1 <= n <= 30

代码

  1. # import pysnooper
  2. class Solution:
  3. # @pysnooper.snoop()
  4. def countAndSay(self, n: int) -> str:
  5. if n == 1:
  6. return '1'
  7. else:
  8. return self.nextItem(self.countAndSay(n-1))
  9. # @pysnooper.snoop()
  10. def nextItem(self, str_n: str):
  11. # str_n = '1'
  12. result = ''
  13. time = 1
  14. str_n +='e'
  15. for i in range(len(str_n)-1):
  16. if str_n[i] == str_n[i+1]:
  17. time +=1
  18. else:
  19. result = result + str(time) + str_n[i]
  20. time = 1
  21. return result

执行效率

30 个测试用例
执行用时: 48 ms
内存消耗: 13.5 MB

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

发表评论

表情:
评论列表 (有 0 条评论,196人围观)

还没有评论,来说两句吧...

相关阅读

    相关 38. 外观数列

    打卡!!!每日一题 今天给大家带来一道比较有意思的题目,先看看题目描述 题目描述: ![在这里插入图片描述][82dc3a8d28064fa79835d3bb5c71f

    相关 38. 外观数列[C++,模拟]

    给定一个正整数 n ,输出外观数列的第 n 项。 「外观数列」是一个整数序列,从数字 1 开始,序列中的每一项都是对前一项的描述。 你可以将其视作是由递归公式定义的数字字符