1. 原始题目
报数序列是一个整数序列,按照其中的整数的顺序进行报数,得到下一个数。其前五项如下:
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"
2. 思路
这个题目可能比较拗口。其实思路很简单:对于每个数字m,按照如下方式得到其下一个数字:依次读取m中每个连续的数字,将该数字的连续次数和该数字放到新的串中。
例如:m=1211,那如何得到111221? 先建立一个空列表results=[]
首先将m中每个连续数字分解: 1 2 11
1连续次数为1。results=[1,1]。
2连续次数为1。更新results=[1,1,1,2]。
11连续次数为2。更新results=[1,1,1,2,2,1]。
好了,也就是说我们要在上一次的基础上进行分解,计数,然后加入到当前列表中。这种有先后关系的操作第一想法就是递归。
3. 思路
1 class Solution: 2 def countAndSay(self, n: int) -> str: 3 if n==1: return "1" # 设置递归结束条件,就是n为1的情况 4 else: 5 before = self.countAndSay(n-1) # 不然的话,我们先获取上一次的结果 6 k = i =0 # k和i搭配用来计算当前的字符以及其出现的次数 7 results = [] 8 while(i<len(before)): 9 while (i <len(before)) and(before[k]==before[i]): # 连续的字符串 10 i+=1 11 results.extend([str(i-k),before[k]]) # i-k为出现的次数,before[k]为当前的字符 12 k=i 13 results = "".join(results) # 因为结果是串,所以再转换一下 14 return results
哈哈,不喜欢递归的我也开始用递归了。。。