Leetcode 38. Count and Say 报数

Leetcode 38. Count and Say 报数

标签: Leetcode


题目地址:https://leetcode-cn.com/problems/count-and-say/

题目描述

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

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"

算法思想

从题目描述可以看出来,下一个数的报数是基于上一个的,就是把上一个数找到,然后进行一下转换即可,比如我要找到4,那么我就找到3的,然后把3的进行一下转换,而要计算3则需要2,这里又有递归的思想,所以伪代码为:

countSay(n):
    # 先计算最简单的
    如果 n ==1:返回"1"
    如果 n ==2:返回"11"
    return func(countSay(n-1))

而这里关键在于func怎么定义,从题目描述可以看出,func就是从头到尾遍历一遍,看看这个数出现几次,然后就念出来即可,比如11131,而111因为有一个1。

python代码


class Solution(object):

    def decode(self,s):
        res = ''
        l = len(s)
        i = 0
        t = 1
        while i<l:
            if i+1<l and s[i]==s[i+1]:
                t+=1
                i+=1
            else:
                res+=(str(t)+s[i])
                i +=1
                t = 1
        return res
    def countAndSay(self, n):
        """
        :type n: int
        :rtype: str
        """
        # 找最简单的
        if n==1:
            return "1"
        if n ==2:
            return "11"
        # 如果找5-> 其实就是先找到4的,然后把4按照报数解码即可,所以递归
        return self.decode(self.countAndSay(n-1))

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值