每日一练 · 迷你语法分析器

111 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第12天,点击查看活动详情

一、题目描述:

给定一个字符串 s 表示一个整数嵌套列表,实现一个解析它的语法分析器并返回解析的结果 NestedInteger 。

列表中的每个元素只可能是整数或整数嵌套列表

 

示例 1:

输入:s = "324", 输出:324 解释:你应该返回一个 NestedInteger 对象,其中只包含整数值 324。 示例 2:

输入:s = "[123,[456,[789]]]", 输出:[123,[456,[789]]] 解释:返回一个 NestedInteger 对象包含一个有两个元素的嵌套列表:

  1. 一个 integer 包含值 123
  2. 一个包含两个元素的嵌套列表: i. 一个 integer 包含值 456 ii. 一个包含一个元素的嵌套列表 a. 一个 integer 包含值 789  

提示:

1 <= s.length <= 5 * 104 s 由数字、方括号 "[]"、负号 '-' 、逗号 ','组成 用例保证 s 是可解析的 NestedInteger 输入中的所有值的范围是 [-106, 106]

二、思路分析:

利用栈 stack 元素添加 append 以及元素删除 pop 和 NestedInteger 的 add 模拟实现,分以下4种情况分析:

  • 遇到 -0123456789 将连续的数字字符串取出, 并保留为 num
  • 遇到 , 创建数值型的 NestedInteger 实例值为 num 并压入最后的一个嵌套 list 中
  • 遇到 [ 创建一个嵌套类型的 NestedInteger list 实例值并压入栈中,并添加数值型的 NestedInteger 实例值为 None
  • 遇到 ] 创建数值型的 NestedInteger 实例值为 num 并压入最后一个嵌套 list 中,并从栈中取出当前与 [ 匹配的list NestedInteger 实例

三、AC 代码:

class Solution:
    def deserialize(self, s: str) -> NestedInteger:
        stack, num, last = [], "", ""
        for c in s:
            if c in set('-0123456789'): 
                num += c
            elif c == "," and num:
                stack[-1].add(NestedInteger(int(num)))
                num = ""
            elif c == "[":
                elem = NestedInteger()
                if stack: 
                    stack[-1].add(elem)
                stack.append(elem)
            elif c == "]":
                if num:
                    stack[-1].add(NestedInteger(int(num)))
                    num = ""
                last = stack.pop()
        return last if last else NestedInteger(int(num))




四、总结:

image.png

掘友们,解题不易,留下个赞或评论再走吧!谢啦~ 💐

希望对你有帮助

期待下次再见~

🌇 点赞 👍 收藏 ⭐留言 📝 一键三连 ~关注从你我做