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

解题思路:

1. 使用栈来解题,遍历字符串,遇到 "[" 就入栈一个 NestedInteger,当遇到 "]" 时,就出栈一个NestedInteger,并调用栈顶元素的add方法,将新出栈的元素加到栈顶元素NestedInteger对象中,构成嵌套列表.

几个坑:

1. 可能会包含空嵌套列表[],比如:"[123,456,[788,799,833],[[]],10,[]]",所以在解析数字部分时,需要判断 [] 中有没有数字,有数字才调用一个带参数的构造器

2. 题目中NestedInteger给出了许多api,有用的其实只有三个:

        1. public NestedInteger():构造一个空的嵌套列表,t1 = NestedInteger(),即 t1=[]

        2. public NestedInteger(int value); 构造一个包含整数的嵌套列表,t2 = NestedInteger(123),

        3. public void add(NestedInteger ni):为嵌套列表添加一个元素ni,ni也为嵌套列表

NestedInteger t1 = new NestedInteger(); //t1=[]
NestedInteger t2 = new NestedInteger(123);//t2=123

t1.add(t2);// t1=[123]

NestedInteger t3 = new NestedInteger(456); //t3=456

t1.add(t3);// t1=[123,456]

NestedInteger t4 = new NestedInteger();//t4=[]

t4.add(t2);// t4 = [123]

t4.add(t1);// t4 = [123,[123,456]]

AC代码:

public class Solution {
    public static NestedInteger deserialize(String s) {
        LinkedList result = new LinkedList<>();
        NestedInteger top = null;

        //只有一个整数的情况
        if (s.charAt(0) != '[') {
            return new NestedInteger(Integer.parseInt(s));
        }

        //是否为负数
        boolean flag = false;
        //字符串对应的整数
        int num = 0;
        //数字部分子串长度
        int length = 0;

        for (int i = 0; i < s.length(); i++) {
            //入栈
            if (s.charAt(i) == '[') {
                result.push(new NestedInteger());
            } 
            //负数
            else if (s.charAt(i) == '-') {
                flag = true;
            }
            //遇到 ','和 ']' 需要把当前解析过的数字加入嵌套列表
            else if (s.charAt(i) == ',' || s.charAt(i) == ']') {
                //如果数字长度不为0.添加该嵌套列表
                if(length !=0){
                    if (flag) {
                        num *= -1;
                    }
                    result.peek().add(new NestedInteger(num));
                    num = 0;
                    flag = false;
                    length = 0;
                }
                
                //出栈
                if(s.charAt(i)==']'){
                    top = result.pop();
                    if (result.size() != 0) {
                        //将出栈的嵌套列表加入栈顶的嵌套列表中
                        result.peek().add(top);
                    }
                }

            }  else {
                length++;
                num = num * 10 + s.charAt(i) - '0';
            }
        }
        return top;

    }
}

你可能感兴趣的:(LeetCode_Java版,java)