<LeetCode天梯>Day022 外观数列(递归+双指针) | 初级算法 | Python
以下为我的天梯积分规则:
每日至少一题:一题积分+10分
若多做了一题(或多一种方法解答),则当日积分+20分(+10+10)
若做了三道以上,则从第三题开始算+20分(如:做了三道题则积分-10+10+20=40;做了四道题则积分–10+10+20+20=60)
初始分为100分
若差一天没做题,则扣积分-10分(周六、周日除外注:休息)
坚持!!!
初级算法
刷题目录
字符串
题干
给定一个正整数 n ,输出外观数列的第 n 项。
「外观数列」是一个整数序列,从数字 1 开始,序列中的每一项都是对前一项的描述。
你可以将其视作是由递归公式定义的数字字符串序列:
- countAndSay(1) = “1”
- countAndSay(n) 是对 countAndSay(n-1) 的描述,然后转换成另一个数字字符串。
前五项如下:
要 描述 一个数字字符串,首先要将字符串分割为 最小 数量的组,每个组都由连续的最多 相同字符 组成。然后对于每个组,先描述字符的数量,然后描述字符,形成一个描述组。要将描述转换为数字字符串,先将每组中的字符数量用数字替换,再将所有描述组连接起来。
例如,数字字符串 “3322251” 的描述如下图:
示例1:
输入:n = 1
输出:“1”
解释:这是一个基本样例。
示例2:
输入:n = 4
输出:“1211”
解释:
countAndSay(1) = “1”
countAndSay(2) = 读 “1” = 一 个 1 = “11”
countAndSay(3) = 读 “11” = 二 个 1 = “21”
countAndSay(4) = 读 “21” = 一 个 2 + 一 个 1 = “12” + “11” = “1211”
提示:
- 1 <= n <= 30
递归法+双指针
分析:
根据上面的规则,输入的是n,输出第n次描述,也就是描述上一层的数字。
这里得用上递归的思想,每一次都进行迭代,然后根据输入的n,作为停止的判断,然后直接输出当前层的描述。
依次读取上一层,先对每一个字符进行索引,判断是否相同,直到不同,记下相同的个数用于描述,再继续读取,读到不同,则停止,每次不同都停止,切片,然后做计算,最后再描述。递归此过程。
需要先定义好出口,当n=1时,输出为1.
class Solution:
def countAndSay(self, n: int) -> str:
if n == 1:
return "1" # 设置递归出口
# 假设我们上一层的结果为“112213”
s1 = countAndSay(n-1) # 递归
res = '' # 设置新串
slow = 0 # 慢指针
fast = 1 # 快指针
s1 += '0' # 末尾标志,因为不会出现0
while fast < len(s1):
if s1[slow] != s1[fast]: # 判断是否数字相同
res += str(fast-slow) + str(s1[slow]) # 前半部分表示后半部分的个数
slow = fast # 遇到不同,将快指针位置赋值给慢指针
fast += 1
return res
递归感觉不是那么的快,需要多理解理解!
还有一种动态规划的办法。
动态规划
今天就先到这儿吧,明天再更新新方法!~
Reference
作者:力扣 (LeetCode)
链接:https://leetcode-cn.com/leetbook/read/top-interview-questions-easy/xnpvdm/
来源:力扣(LeetCode)
今日得分:+10
总得分:470加油!!!
❤坚持读Paper,坚持做笔记,坚持学习,坚持刷力扣LeetCode❤!!!
坚持刷题!!!打天梯!!!
⚡To Be No.1⚡⚡哈哈哈哈
⚡创作不易⚡,过路能❤关注、收藏、点个赞❤三连就最好不过了
ღ( ´・ᴗ・` )
❤
『
灯火欲离失,轻影黯花湿。微浮半谋面,我与泪三痴!
』
- 点赞
- 收藏
- 关注作者
评论(0)