Leetcode | Mini Parser

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:

  1. An integer containing value 123.
  2. 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;


}}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值