问题描述:
38. 外观数列
报数序列是指一个整数序列,按照其中的整数的顺序进行报数,得到下一个数。其前五项如下:
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 ,输出报数序列的第 n 项。
注意:整数顺序将表示为一个字符串。
示例 1:
输入: 1 输出: "1"
示例 2:
输入: 4 输出: "1211"
问题分析:
这个题目不难,主要是理解题意,简单来说就是,后一个人读前面那人得出的结果,例如,n=3, 21, 其中21就是对应的n=2中11(2个1=21),依次类推,可以使用递归实现也可以使用非递归实现。
Python3实现:
# @Time :2018/7/8
# @Author :LiuYinxing
class Solution(object):
def countAndSay(self, n): # 递归实现
if n == 1: return '1' # 递归出口
s = self.countAndSay(n-1)
res, count = '', 0
for i in range(len(s)):
count += 1
if i == len(s) - 1 or s[i] != s[i+1]: # 最后一个字符串要提前终止
res += str(count)
res += s[i]
count = 0
return res
def countAndSay1(self, n): # 非递归实现
if n == 1: return '1'
res = '1'
while n > 1:
s, res, count = res, '', 0
for i in range(len(s)):
count += 1
if i == len(s) - 1 or s[i] != s[i + 1]: # 最后一个字符串要提前终止
res += str(count)
res += s[i]
count = 0
n -= 1
return res
if __name__ == '__main__':
solu = Solution()
print(solu.countAndSay(n=10))
欢迎指正哦