Leetcode 38. Count and Say 报数
标签: Leetcode
题目地址:https://leetcode-cn.com/problems/count-and-say/
题目描述
报数序列是一个整数序列,按照其中的整数的顺序进行报数,得到下一个数。其前五项如下:
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"
算法思想
从题目描述可以看出来,下一个数的报数是基于上一个的,就是把上一个数找到,然后进行一下转换即可,比如我要找到4,那么我就找到3的,然后把3的进行一下转换,而要计算3则需要2,这里又有递归的思想,所以伪代码为:
countSay(n):
# 先计算最简单的
如果 n ==1:返回"1"
如果 n ==2:返回"11"
return func(countSay(n-1))
而这里关键在于func怎么定义,从题目描述可以看出,func就是从头到尾遍历一遍,看看这个数出现几次,然后就念出来即可,比如111
为31
,而1
为11
因为有一个1。
python代码
class Solution(object):
def decode(self,s):
res = ''
l = len(s)
i = 0
t = 1
while i<l:
if i+1<l and s[i]==s[i+1]:
t+=1
i+=1
else:
res+=(str(t)+s[i])
i +=1
t = 1
return res
def countAndSay(self, n):
"""
:type n: int
:rtype: str
"""
# 找最简单的
if n==1:
return "1"
if n ==2:
return "11"
# 如果找5-> 其实就是先找到4的,然后把4按照报数解码即可,所以递归
return self.decode(self.countAndSay(n-1))