Leetcode算法——38、数数并说

本文介绍了一种名为“数数并说”的整数序列生成方法,通过递归算法实现序列的生成。从序列的第二项开始,每一项都是对前一项的计数描述,例如11读作“两个1”,即21。文章提供了Python实现代码,并通过示例展示了序列的生成过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数数并说序列是一个整数序列,第二项起每一项的值为对前一项的记数,其前五项如下:

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

1 读作 “1个1”,即 11
11 读作 “两个1”,即 21
21 读作 “一个2,一个1”,即 1211

给定一个整数n,1 ≤ n ≤ 30,生成数数并说序列的第 n 项。
备注:该整数序列的每一项都输出为字符串。

示例:
Example 1:
Input: 1
Output: “1”

Example 2:
Input: 4
Output: “1211”

思路

由于第 n 项的值,总是由第 n-1 项来决定的,因此可以使用递归法求解第 n-1 项的值,我们需要关心的,就是如何从第 n-1 项得到第 n 项。

根据序列的定义,需要对输入的序列从左到右进行数数,规则为:
1、如果相邻的数不同,则记为“1个X”
2、如果相邻的数相同,则继续向后遍历,直至出现了不同的数,那么前面这些相同的数作为一个整体记为“m个X”
3、循环遍历,直至遍历到最后一位。

这样,我们就知道了如何从第 n-1 项获取到第 n 项。

递归法还需要规定递归结束条件:n=1时,序列的第一项的值规定为 1。

python实现

def countAndSay(n):
    """
    :type n: int
    :rtype: str
    递归法。
    """
    
    # 递归结束条件
    if n == 1:
        return "1"
    
    # 递归获得前一项
    # 末尾加上哨兵值,保证输出所有记数
    pre = countAndSay(n-1) + '.'
    
    # 开始遍历
    tmp = pre[0]
    count = 1
    result = ''
    for i in range(1, len(pre)):
        if pre[i] == tmp: # 与前一项相同
            count += 1
        else: # 与前一项不同,则输出
            result += str(count) + tmp
            tmp = pre[i]
            count = 1
    
    return result

if '__main__' == __name__:
    n = 5
    print(countAndSay(n))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值