[Leetcode] 341. Flatten Nested List Iterator 解题报告

来源:互联网 发布:开票软件双击打不开 编辑:程序博客网 时间:2024/06/03 21:02

题目

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].

思路

我们用栈来解决这个问题:首先将NestedInteger数组里面的元素逆序加入栈中,然后检查栈顶元素,如果是list,则将其弹出,并将其内部元素逆序加入栈中,重复这一过程直到栈顶元素是Integer。在next()函数中,首先弹出栈顶元素并记录其Integer的值。但是此时还要检查栈顶元素是不是Integer,如果不是,还需要采用和上面相同的方法,摊平栈顶元素直到其顶部元素是Integer而不是list,最后再返回刚才记录的Integer的值。

代码

/** * // This is the interface that allows for creating nested lists. * // You should not implement it, or speculate about its implementation * class NestedInteger { *   public: *     // Return true if this NestedInteger holds a single integer, rather than a nested list. *     bool isInteger() const; * *     // Return the single integer that this NestedInteger holds, if it holds a single integer *     // The result is undefined if this NestedInteger holds a nested list *     int getInteger() const; * *     // Return the nested list that this NestedInteger holds, if it holds a nested list *     // The result is undefined if this NestedInteger holds a single integer *     const vector<NestedInteger> &getList() const; * }; */class NestedIterator {public:    NestedIterator(vector<NestedInteger> &nestedList) {        for (auto it = nestedList.rbegin(); it != nestedList.rend(); ++it) {            st.push(*it);        }        while (!st.empty() && !st.top().isInteger()) {            NestedInteger ni = st.top();            st.pop();            vector<NestedInteger> &list = ni.getList();            for (auto it = list.rbegin(); it != list.rend(); ++it) {                st.push(*it);            }        }    }    int next() {        int ret = st.top().getInteger();        st.pop();        while (!st.empty() && !st.top().isInteger()) {            NestedInteger ni = st.top();            st.pop();            vector<NestedInteger> &list = ni.getList();            for (auto it = list.rbegin(); it != list.rend(); ++it) {                st.push(*it);            }        }        return ret;    }    bool hasNext() {        return !st.empty();    }private:    stack<NestedInteger> st;};/** * Your NestedIterator object will be instantiated and called as such: * NestedIterator i(nestedList); * while (i.hasNext()) cout << i.next(); */