question
Given a nested list of integers represented as a string, implement a parser to deserialize it.
Each element is either an integer, or a list – whose elements may also be integers or other lists.
Note: You may assume that the string is well-formed:
String is non-empty.
String does not contain white spaces.
String contains only digits 0-9, [, - ,, ].
Example 1:
Given s = “324”,
You should return a NestedInteger object which contains a single integer 324.
Example 2:
Given s = “[123,[456,[789]]]”,
Return a NestedInteger object containing a nested list with 2 elements:
- An integer containing value 123.
- A nested list containing two elements:
i. An integer containing value 456.
ii. A nested list with one element:
a. An integer containing value 789.
thought of solotion
对每输入的每个字符进行判断
数字: 用l保存开始 用i保存数字最后一位的下一位 用substring进行裁剪
字符‘[’ :遇到[时将上一级的NestedInteger保存入栈 进行下一步操作
字符’]’:判断是否需要将数字加入当前NestedInteger,然后将上一级NestedInteger弹出 将这一级的NestedInteger加入到上一级的NestedInteger中去
字符’,’判断是否要讲数字加入当前NestedInteger
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 getList();
* }
*/
spublic class Solution {
public NestedInteger deserialize(String s) {
if(s.isEmpty())
{
return new NestedInteger() ;
}
if(s.charAt(0)!='[')
{
return new NestedInteger(Integer.valueOf(s));
}
NestedInteger cur=null;
//System.out.println(cur+" "+cur.getList()+" "+cur.getInteger());
Stack<NestedInteger> stack=new Stack<NestedInteger>();
int i=0;
int len=s.length();
char ch;
int l=0;
// l begin of the number
//i after the end of the number
while(i < len)
{
ch=s.charAt(i);
if(ch=='[')
{
if(cur!=null)
stack.push(cur);
cur=new NestedInteger();
l=i+1;
}else if(ch==']')
{
String temp=s.substring(l,i);
if(!temp.isEmpty())
{
cur.add(new NestedInteger(Integer.valueOf(temp)));
}
if(!stack.empty())
{
NestedInteger pop=stack.pop();
pop.add(cur);
cur=pop;
}
l=i+1;
}else if(ch==',')
{
if(s.charAt(i-1)!=']')
{
String temp=s.substring(l,i);
cur.add(new NestedInteger(Integer.valueOf(temp)));
}
l=i+1;
}
i++;
}
return cur;
}}