LeetCode刷题|38外观数组

做了半天的一道题一看竟然是一道简单题。。

题目描述

在这里插入图片描述
地址:外观数组
题目意思很好理解,就是一个递归的过程,从‘1’开始,对每一个输入字符串做一个几个几这样格式的描述,然后再把这个描述作为下一次的输入,直到求出第n项的结果。

解法一

这题是一个比较明显的递归题目,但是由于我递归学的不好,所以就考虑如何不使用递归直接做出来。那么简单说一下我的想法。我的做法就是先写一个将输入字符串进行划分并描述的函数,然后反复调用这个函数就可以了。所以这种方法的重点在于如何写字符串划分并描述的函数。

class Solution:
    def countAndSay(self, n: int) -> str:
        if n ==1:
            return '1'
        res = self.countandsay('1')
        for i in range(2,n):
            t = self.countandsay(res)
            res = t
        return res

    def countandsay(self, s: str) -> str:
        res = []
        count = 1
        pres = s[0]
        i, n = 1, len(s)
        if n == 1:
            res.append('1')
            res.append(str(s[0]))
            return ''.join(res)
        while i < n:
            if pres == s[i]:
                count = count + 1
                i = i+1
            else:
                res.append(str(count))
                res.append(str(pres))
                pres = s[i]
                count = 0
        if count > 0:
            res.append(str(count))
            res.append(str(s[n-1]))
        return "".join(res)

求字符串的描述直接对字符串遍历,比较每一个字符跟前一个字符是否相同并计数,然后在数组中保存每一次遍历到的字符以及出现的次数,最后将数组转化为字符串返回。

递归+双指针

来自评论区的方法,感觉这才是这题要考的东西。

class Solution:
    def countAndSay(self, n: int) -> str:
        if n == 1:
            return '1'
        s = self.countAndSay(n - 1)
        
        ans = ''
        start, end = 0, 0
        while end < len(s):
            while end < len(s) and s[start] == s[end]:
                end += 1
            ans += str(end - start) + s[start]
            start = end

        return ans

作者:喜欢叶梓🍃的汪
链接:https://leetcode-cn.com/leetbook/read/top-interview-questions-easy/xnpvdm/?discussion=sKH5WT
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

递归还是需要好好学一下😑

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值