zoukankan      html  css  js  c++  java
  • 385. Mini Parser

    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.

    Approach #1: Similate. [Java]

    /**
     * // 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.isEmpty()) return null;
            if (s.charAt(0) != '[') return new NestedInteger(Integer.valueOf(s));
            
            Stack<NestedInteger> stack = new Stack<>();
            NestedInteger curr = null;
            int l = 0;
            for (int r = 0; r < s.length(); ++r) {
                char ch = s.charAt(r);
                if (ch == '[') {
                    if (curr != null) stack.push(curr);
                    curr = new NestedInteger();
                    l = r + 1;
                } else if (ch == ']') {
                    String num = s.substring(l, r);
                    if (!num.isEmpty()) 
                        curr.add(new NestedInteger(Integer.valueOf(num)));
                    if (!stack.isEmpty()) {
                        NestedInteger pop = stack.pop();
                        pop.add(curr);
                        curr = pop;
                    }
                    l = r + 1;
                } else if (ch == ',') {
                    if (s.charAt(r-1) != ']') {
                        String num = s.substring(l, r);
                        curr.add(new NestedInteger(Integer.valueOf(num)));
                    }
                    l = r + 1;
                }
            }
            return curr;
        }
    }
    

      

    Analysis:

    Maybe this is easy to think, but i can't realise it with code at the first time.

    This approach will just iterator through every char in the string (no recursion).

    If encounters '[', push current NestedInteger to stack and start a new on.

    If encounters ']', end current NestedInteger and pop a NestedInteger from stack to continue.

    If encounters ',', append a new number to curr NestedInteger, if this comma is not right after a brackets.

    Update index l and r, where l shall point to the start of a integer substring, while r shall points to the end + 1 of substring.

    The method of updating the index l is a new way to get the substring from a string.

    Reference:

    https://leetcode.com/problems/mini-parser/discuss/86066/An-Java-Iterative-Solution

    永远渴望,大智若愚(stay hungry, stay foolish)
  • 相关阅读:
    安卓AndroidManifest.xml介绍
    Android系统开发入门
    蓝牙协议(bluetooth spec)
    解决:NoSuchAlgorithmException: Algorithm HmacSHA1 not available
    Spring bean 实现初始化、销毁方法的方式及顺序
    解决: maven编译项目报“非法字符: 65279 ”错误
    解决:eclipse 非正常关闭,导致无法正常启动
    ffmpeg 音频转换: use ffmpeg convert the audio from stereo to mono without changing the video part
    win10家庭版快速升级专业版
    Linux下更改目录及其下的子目录和文件的访问权限
  • 原文地址:https://www.cnblogs.com/h-hkai/p/10718628.html
Copyright © 2011-2022 走看看