力扣算法_385 迷你语法分析器

385 迷你语法分析器

题目

给定一个字符串 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

思路

方法一:首先判断字符串s的第一个字符是否为数字或‘-’,如果是,则字符串仅包含数字,可以直接输出int(s)。否则,该字符串为列表。此时就需要遍历字符串的所有字符,分类讨论。如果字符为[,则需要先使用NestedInteger创建一个空列表;如果字符为,且前面一位为数字,则说明一个数字已经遍历结束,需要将其存入NestedInteger中;如果字符为-,则说明后面的数字是负数,保存时需要将其添加负号;如果字符为],且前面一位为数字,则说明一个数字遍历结束,且一个列表遍历结束,需要存在上一个创建的NestedInteger中;如果是数字,则将curVal再乘10的基础上加该数字。
由于涉及到频繁的数字、列表出入,因此可以将NestedInteger放入一个栈中,最后弹出栈的最后一位即可。

代码

class Solution:
    def deserialize(self, s: str) -> NestedInteger:
        if s[0] != '[': return NestedInteger(int(s))
        stack, curVal, sign = [], 0, False
        for i, c in enumerate(s):
            if c == '[': stack.append(NestedInteger())
            elif c == '-': sign = True
            elif c == ',': 
                if s[i-1].isdigit(): stack[-1].add(NestedInteger(-curVal if sign else curVal))
                curVal, sign = 0, False
            elif c == ']':
                if s[i-1].isdigit(): stack[-1].add(NestedInteger(-curVal if sign else curVal))
                if len(stack) > 1:
                    cur = stack.pop()
                    stack[-1].add(cur)
                curVal, sign = 0, False
            else:
                curVal = curVal * 10 + int(c)
        return stack.pop()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值