Leetcode算法——38、数数并说

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/HappyRocking/article/details/84064510

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

  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))

猜你喜欢

转载自blog.csdn.net/HappyRocking/article/details/84064510