Leetcode0385. 迷你语法分析器(medium)

目录

1. 题目描述

2. 解题分析

3.代码实现


1. 题目描述

给定一个字符串 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 * 10^4
  • s 由数字、方括号 "[]"、负号 '-' 、逗号 ','组成
  • 用例保证 s 是可解析的 NestedInteger
  • 输入中的所有值的范围是 [-10^6, 10^6]

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/mini-parser
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. 解题分析

        应该就是类似于代数表达式评估,以方括号配对为主线去进行处理。其中“,”只是一个分隔符,可以直接跳过。

        此类问题可以用栈来实现。

        将字符一个一个压入栈,碰到“]”时,再从栈中弹出字符找到与它配对的"[",然后据此得到这一对“[]”内的数据或者嵌套数据。

        遍历输入字符串的过程中,碰到表示整数的子串(由连续的负号、数字构成),将其转换为整数并生成一个NestedInteger对象并放入栈中。

        碰到一对"[]",应该为它创建一个NestedInteger。并将此对括号之间的NestedInteger对象作为它的成员加入。需要注意到的一点是,一对"[]"之间的成员要倒序加入。不明白为什么,反正内容反了leetcode判错^-^.

3.代码实现

# """
# This is the interface that allows for creating nested lists.
# You should not implement it, or speculate about its implementation
# """
#class NestedInteger:
#    def __init__(self, value=None):
#        """
#        If value is not specified, initializes an empty list.
#        Otherwise initializes a single integer equal to value.
#        """
#
#    def isInteger(self):
#        """
#        @return True if this NestedInteger holds a single integer, rather than a nested list.
#        :rtype bool
#        """
#
#    def add(self, elem):
#        """
#        Set this NestedInteger to hold a nested list and adds a nested integer elem to it.
#        :rtype void
#        """
#
#    def setInteger(self, value):
#        """
#        Set this NestedInteger to hold a single integer equal to value.
#        :rtype void
#        """
#
#    def getInteger(self):
#        """
#        @return the single integer that this NestedInteger holds, if it holds a single integer
#        Return None if this NestedInteger holds a nested list
#        :rtype int
#        """
#
#    def getList(self):
#        """
#        @return the nested list that this NestedInteger holds, if it holds a nested list
#        Return None if this NestedInteger holds a single integer
#        :rtype List[NestedInteger]
#        """
class Solution:
    def deserialize(self, s: str) -> NestedInteger:
        if s[0] != '[':
            return NestedInteger(int(s))

        q = collections.deque()
        digitSeq = ''

        for c in s:
            if c.isdigit() or c=='-':
                digitSeq = digitSeq + c
            else:
                if len(digitSeq) > 0:
                    q.append(int(digitSeq))
                    digitSeq = '' # clear digitSeq to an empty string
                if c==",": # ignore it
                    continue
                elif c=='[':
                    q.append(c)
                else: 
                    # ']', trace back to search for the matching
                    # print(q)
                    L = []
                    while True:
                        a = q.pop()
                        if a != '[':
                            L.append(a) 
                        else: 
                            # '[' found
                            ni = NestedInteger()
                            for k in range(len(L)-1,-1,-1):
                                if isinstance(L[k],int):
                                    ni.add(NestedInteger(L[k]))
                                else:
                                    ni.add(L[k])
                            q.append(ni)
                            break

        return q.pop()

        执行用时:52 ms, 在所有 Python3 提交中击败了87.32%的用户

        内存消耗:18.5 MB, 在所有 Python3 提交中击败了37.32%的用户

        本题由于基于NestedInteger数据结构,leetcode只提供了interface没有实现,所以无法做本地测试。当然不怕麻烦的话也可以先把NestedInteger实现了然后再做本地测试。NestedInteger的实现可以作为另外一各作业了^-^。找时间回头来实现这个NestedInteger作为一个练习。

        回到主目录:笨牛慢耕的Leetcode每日一解题解笔记(动态更新。。。)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

笨牛慢耕

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值