*38. Count and Say

1. 原始题目

报数序列是一个整数序列,按照其中的整数的顺序进行报数,获得下一个数。其前五项以下:spa

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

1 被读做  "one 1"  ("一个一") , 即 11
11 被读做 "two 1s" ("两个一"), 即 21
21 被读做 "one 2",  "one 1" ("一个二" ,  "一个一") , 即 1211code

给定一个正整数 n(1 ≤ n ≤ 30),输出报数序列的第 n 项。blog

注意:整数顺序将表示为一个字符串。递归

 

示例 1:字符串

输入: 1
输出: "1"

示例 2:io

输入: 4
输出: "1211"

2. 思路

这个题目可能比较拗口。其实思路很简单:对于每一个数字m,按照以下方式获得其下一个数字:依次读取m中每一个连续的数字,将该数字的连续次数和该数字放到新的串中。class

例如:m=1211,那如何获得111221?  先创建一个空列表results=[]基础

首先将m中每一个连续数字分解:  1     2     11di

1连续次数为1。results=[1,1]。while

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 

哈哈,不喜欢递归的我也开始用递归了。。。

相关文章
相关标签/搜索