【leetcode】38. 报数

!!!!? 从1(第一步)开始产生后面的数据。 

每次for循环需要保存这一次的结果为下一次计算作铺垫 。


1 读 one one

11 不读 one one one one,读 two one, 连着一起相同的数会先说数量再说值。

以上是基础。接下来看怎么得到下一项的结果。从题目所给出的示例4 : 1211 到 5 : 111221。1211 第一位是1,所以读作 one one,也就是 1 1 。2读作one two, 所以是12。 11连着读作two one, 所以是21。这所有加起来就是答案 111221。

思路:根据报数的特点,我们可以根据上一项的结果推导下一项。我们遍历上一项,辅以计数变量统计一下某些数字出现的次数。同时我们要不断保存上一项。


           由上一层推下一层:例

           第四层推第五层:第四层为1211,从左至右读作:一个一,一个二,两个一   

                                                                         故写作==>11 12 21

           不难看出规律:

                                1.使用计数器计数初始值为1,上层每一个数,不相同记为1

                                2.如果相邻两值相等则计数器加一,记为2。如11下层记为两个一(21),22下层记为两个                                        二(22),而不是211和222.  

           然后遍历保存拼接。
 


class Solution(object):
    def countAndSay(self, n):
        """
        :type n: int
        :rtype: str
        """
        s = '1'
        for _ in range(1, n):
            nextS = ''
            countC = 1
            for i in range(1, len(s)+1):
                if i == len(s) or s[i] != s[i-1]:
                    nextS += str(countC) + s[i-1]
                    countC = 1
                else:
                    countC +=1
            s = nextS
        return s

转:https://blog.csdn.net/AntiZheng/article/details/82763409 

一样的思路:

class Solution(object):
    def countAndSay(self, n):
        """
        :type n: int
        :rtype: str
        """
        if n == 1:
            return "1"
        prev = "1"
        res = ""
        for i in range(1, n):
            count = 1
            for j in range(len(prev)-1):
                if prev[j] == prev[j+1]:
                    count += 1
                else:
                    res += str(count)+prev[j]
                    count = 1
            res += str(count)+prev[-1]
            prev = res
            res = ""
        return prev
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值