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
提示:
1 <= s.length <= 5 * 10
4
s
由数字、方括号"[]"
、负号'-'
、逗号','
组成
- 用例保证
s
是可解析的NestedInteger
- 输入中的所有值的范围是
[-10
6
, 10
6
]
通过次数21,494提交次数40,295
法 1 栈模拟
思路
用栈模拟。
- 遇到左括号,实例化一个 NestedInteger 放入栈中
- 遇到数字,那就先放到临时的num中。
- 遇到逗号,把当前维护的 num 实例化为 一个 NestedInteger 对象,且放到栈中
- 遇到右括号:
- 如果当前num 非空,需要把当前维护的 num 实例化为 一个 NestedInteger 对象,且放到栈中
- 且如果栈中多与两个 NestedInteger 对象,那么需要弹出栈顶的NestedInteger对象,且放入栈中倒数第二个NestedInteger 对象(即此时的栈顶)
题解
# """ # 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: stack = [] num = "" for char in s: # print(char, stack) if char == "[": stack.append(NestedInteger()) elif char == ",": if num != "": stack[-1].add(NestedInteger(int(num))) num = "" elif char == "]": if num != "": stack[-1].add(NestedInteger(int(num))) num = "" if len(stack) > 1: stack[-2].add(stack.pop()) else: num += char return stack.pop() if stack else NestedInteger(int(num))