Leetcode - Mini Parser

`这题没做出来。看了别人的答案。

My code:

/**
 * // This is the interface that allows for creating nested lists.
 * // You should not implement it, or speculate about its implementation
 * public interface NestedInteger {
 *     // Constructor initializes an empty nested list.
 *     public NestedInteger();
 *
 *     // Constructor initializes a single integer.
 *     public NestedInteger(int value);
 *
 *     // @return true if this NestedInteger holds a single integer, rather than a nested list.
 *     public boolean isInteger();
 *
 *     // @return the single integer that this NestedInteger holds, if it holds a single integer
 *     // Return null if this NestedInteger holds a nested list
 *     public Integer getInteger();
 *
 *     // Set this NestedInteger to hold a single integer.
 *     public void setInteger(int value);
 *
 *     // Set this NestedInteger to hold a nested list and adds a nested integer to it.
 *     public void add(NestedInteger ni);
 *
 *     // @return the nested list that this NestedInteger holds, if it holds a nested list
 *     // Return null if this NestedInteger holds a single integer
 *     public List<NestedInteger> getList();
 * }
 */
public class Solution {
    public NestedInteger deserialize(String s) {
        if (s == null || s.length() == 0) {
            return null;
        }
        
        if (s.charAt(0) != '[') {
            return new NestedInteger(Integer.parseInt(s));
        }
        
        Stack<NestedInteger> st = new Stack<NestedInteger>();
        String temp = "";
        for (int i = 0; i < s.length(); i++) {
            char curr = s.charAt(i);
            switch (curr) {
                case '[':
                    st.push(new NestedInteger());
                    break;
                case ']':
                    if (temp.length() != 0) {
                        st.peek().add(new NestedInteger(Integer.parseInt(temp)));
                        temp = "";
                    }               
                    if (st.size() > 1) {
                        NestedInteger node = st.pop();
                        st.peek().add(node);
                    }
                    break;
                case ',':
                    if (temp.length() != 0) {
                        st.peek().add(new NestedInteger(Integer.parseInt(temp)));
                        temp = "";
                    }
                    break;
                default:
                    temp = temp + curr;
                    break;
            }
        }
        
        return st.pop();
    }
}

reference:
https://discuss.leetcode.com/topic/54534/my-simple-solution-java

这道题目一开始理解错了。
我以为, NestedInteger 里面要么是Integer,要么是NestedInteger

脑子混了。
其实,
NestedInteger.setValue(val);

==

NestedInteger.add(new NestedInteger(val));

所以就是一直往前走,
碰到 ‘[‘, 入栈一个新的 NestedInteger
碰到 ‘,’ 将新的数字 (注意这里得判断这个字符串是否为空)加入到栈顶的NestedInteger 中。
碰到 ‘]’, 这里是关键
首先,如果有数字,先加入到栈顶的NestedInteger中。
然后,如果此时栈的size > 1,说明一个事,栈顶的 NestedInteger是前一个NestedInteger 的子元素,即嵌套。
所以,弹出,然后插入到此时的栈顶。
处理的很巧妙。
其他情况下,就简单地加上字符就行了。

Anyway, Good luck, Richardo! — 08/21/2016

    原文作者:Richardo92
    原文地址: https://www.jianshu.com/p/4578be7c2270#comments
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞