zoukankan      html  css  js  c++  java
  • [LeetCode] 341. Flatten Nested List Iterator 压平嵌套链表迭代器

    Given a nested list of integers, implement an iterator to flatten it.

    Each element is either an integer, or a list -- whose elements may also be integers or other lists.

    Example 1:
    Given the list [[1,1],2,[1,1]],

    By calling next repeatedly until hasNext returns false, the order of elements returned by next should be: [1,1,2,1,1].

    Example 2:
    Given the list [1,[4,[6]]],

    By calling next repeatedly until hasNext returns false, the order of elements returned by next should be: [1,4,6].

    将1个含有整数元素的嵌套链表压平,就是把所以元素按嵌套关系变成1个list。按题目要求要有next和hasNext两个函数。

    Java:

    public class NestedIterator implements Iterator<Integer> {
        Stack<NestedInteger> stack;
    
        public NestedIterator(List<NestedInteger> nestedList) {
            stack = new Stack<>();
            pushData(nestedList);
        }
    
        @Override
        public Integer next() {
            return stack.pop().getInteger();
        }
    
        @Override
        public boolean hasNext() {
            while(!stack.isEmpty()) {
                if (stack.peek().isInteger()) {
                    return true;
                }
                pushData(stack.pop().getList());
            }
            return false;
        }
    
        private void pushData(List<NestedInteger> nestedList) {
            for (int i = nestedList.size() - 1; i >= 0; i--) {
                stack.push(nestedList.get(i));
            }
        }
    }
    
    /**
     * Your NestedIterator object will be instantiated and called as such:
     * NestedIterator i = new NestedIterator(nestedList);
     * while (i.hasNext()) v[f()] = i.next();
     */  

    Python: stack

    # """
    # This is the interface that allows for creating nested lists.
    # You should not implement it, or speculate about its implementation
    # """
    #class NestedInteger(object):
    #    def isInteger(self):
    #        """
    #        @return True if this NestedInteger holds a single integer, rather than a nested list.
    #        :rtype bool
    #        """
    #
    #    def getInteger(self):
    #        """
    #        @return the single integer that this NestedInteger holds, if it holds a single integer
    #        Return None if this NestedInteger holds a nested list
    #        :rtype int
    #        """
    #
    #    def getList(self):
    #        """
    #        @return the nested list that this NestedInteger holds, if it holds a nested list
    #        Return None if this NestedInteger holds a single integer
    #        :rtype List[NestedInteger]
    #        """
    
    class NestedIterator(object):
    
        def __init__(self, nestedList):
            """
            Initialize your data structure here.
            :type nestedList: List[NestedInteger]
            """
            self.stack = []
            self.list = nestedList
    
        def next(self):
            """
            :rtype: int
            """
            return self.stack.pop()
                
        def hasNext(self):
            """
            :rtype: bool
            """
            while self.list or self.stack:
                if not self.stack:
                    self.stack.append(self.list.pop(0))
                while self.stack and not self.stack[-1].isInteger():
                    top = self.stack.pop().getList()
                    for e in top[::-1]:
                        self.stack.append(e)
                if self.stack and self.stack[-1].isInteger():
                    return True
            return False
    
    # Your NestedIterator object will be instantiated and called as such:
    # i, v = NestedIterator(nestedList), []
    # while i.hasNext(): v.append(i.next())  

    Python: queue

    class NestedIterator(object):
    
        def __init__(self, nestedList):
            """
            Initialize your data structure here.
            :type nestedList: List[NestedInteger]
            """
            self.queue = collections.deque()
            def getAll(nests):
                for nest in nests:
                    if nest.isInteger():
                        self.queue.append(nest.getInteger())
                    else:
                        getAll(nest.getList())
            getAll(nestedList)
    
        def next(self):
            """
            :rtype: int
            """
            return self.queue.popleft()
    
        def hasNext(self):
            """
            :rtype: bool
            """
            return len(self.queue)
    
    # Your NestedIterator object will be instantiated and called as such:
    # i, v = NestedIterator(nestedList), []
    # while i.hasNext(): v.append(i.next())
    

    C++: stack

    class NestedIterator {
    public:
        NestedIterator(vector<NestedInteger> &nestedList) {
            for (int i = nestedList.size() - 1; i >= 0; --i) {
                s.push(nestedList[i]);
            }
        }
    
        int next() {
            NestedInteger t = s.top(); s.pop();
            return t.getInteger();
        }
    
        bool hasNext() {
            while (!s.empty()) {
                NestedInteger t = s.top(); 
                if (t.isInteger()) return true;
                s.pop();
                for (int i = t.getList().size() - 1; i >= 0; --i) {
                    s.push(t.getList()[i]);
                }
            }
            return false;
        }
    
    private:
        stack<NestedInteger> s;
    };
    

    C++:deque

    class NestedIterator {
    public:
        NestedIterator(vector<NestedInteger> &nestedList) {
            for (auto a : nestedList) {
                d.push_back(a);
            }
        }
    
        int next() {
            NestedInteger t = d.front(); d.pop_front();
            return t.getInteger();
        }
    
        bool hasNext() {
            while (!d.empty()) {
                NestedInteger t = d.front();
                if (t.isInteger()) return true;
                d.pop_front();
                for (int i = 0; i < t.getList().size(); ++i) {
                    d.insert(d.begin() + i, t.getList()[i]);
                }
            }
            return false;
        }
    
    private:
        deque<NestedInteger> d;
    };
    

    C++: Recursion

    class NestedIterator {
    public:
        NestedIterator(vector<NestedInteger> &nestedList) {
            make_queue(nestedList);
        }
    
        int next() {
            int t = q.front(); q.pop();
            return t; 
        }
    
        bool hasNext() {
            return !q.empty();
        }
        
    private:
        queue<int> q;
        void make_queue(vector<NestedInteger> &nestedList) {
            for (auto a : nestedList) {
                if (a.isInteger()) q.push(a.getInteger());
                else make_queue(a.getList());
            }
        }
    };

    All LeetCode Questions List 题目汇总

  • 相关阅读:
    进程间通信
    图形的保存与重绘
    mysql记录1
    文件操作
    多线程及聊天室程序
    健康是成功之本
    文档与串行化
    HTML网页制作基础
    Hook和数据库访问
    C++基础笔记1
  • 原文地址:https://www.cnblogs.com/lightwindy/p/8577755.html
Copyright © 2011-2022 走看看