`这题没做出来。看了别人的答案。
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