• *38. Count and Say


    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 
    

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

  • 相关阅读:
    poj2411 状压dp
    棋盘覆盖TYVJ1035(二分图最大匹配)
    poj3417
    无向图边双+缩点
    无向图点双+缩点
    bzoj1123(割点加路径统计)
    【BZOJ1178】会议中心(APIO2009)-贪心+倍增+set
    【BZOJ4650】优秀的拆分(NOI2016)-后缀数组+RMQ+差分
    【BZOJ4569】萌萌哒(SCOI2016)-并查集+倍增
    【BZOJ2208】连通数(JSOI2010)-SCC+DP+bitset
  • 原文地址:https://www.cnblogs.com/king-lps/p/10740472.html
Copyright © 2020-2023  润新知