Java実装LeetCode 385のミニパーサ

385ミニパーサ

文字列によって表される整数のネストされたリストを考えると、解析パーサを実現しています。

リストの各要素は、整数またはネストされたリストを指定できます

ヒント:あなたは、これらの文字列は良いフォーマットであると仮定することができます:

非空の文字列
にスペースが含まれていない文字
列が数値のみが含まれている0-9、[ - 、]

例1:

给定 s = "324",

你应该返回一个 NestedInteger 对象,其中只包含整数值 324

例2:

给定 s = "[123,[456,[789]]]",

返回一个 NestedInteger 对象包含一个有两个元素的嵌套列表:

1. 一个 integer 包含值 123
2. 一个包含两个元素的嵌套列表:
    i.  一个 integer 包含值 456
    ii. 一个包含一个元素的嵌套列表
         a. 一个 integer 包含值 789
/**
 * // 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();
 * }
 */
class Solution {
      public NestedInteger deserialize(String s) {
        if(s.charAt(0)!='[') {
            return new NestedInteger(Integer.valueOf(s));
        }
        else {
            return deserialize1(s.substring(1));
        }
    }

    public NestedInteger deserialize1(String s) {
        NestedInteger res = new NestedInteger();
        //从左到右扫描
        for(int i=0;i<s.length();i++) {
            char c = s.charAt(i);
            if(c>='0'&&c<='9'||c=='-') {
                int n = 0; int flag = 1;
                for(;i<s.length();i++) {
                    c = s.charAt(i);
                    if(c>='0'&&c<='9') {
                        n = n*10 + c-'0';
                    } else if(c=='-'){
                        flag = -1;
                    } else {
                        i = i-1;
                        break;
                    }
                }
                res.add(new NestedInteger(flag*n));
            }
            else if(c=='[') {
                int index = i;
                int counter = 0;
                for(;i<s.length();i++) {
                    c = s.charAt(i);
                    if(c=='[') counter++;
                    else if(c==']') counter--;
                    if(counter==0) {
                        res.add(deserialize1(s.substring(index+1,i)));
                        break;
                    }
                }
            }
        }
        return res;
    }
}
リリース1497元の記事 ウォンの賞賛20000 + ビュー189万+

おすすめ

転載: blog.csdn.net/a1439775520/article/details/104808336