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 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65
| * // 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 { private: stack< NestedInteger > lists; public: NestedIterator(vector<NestedInteger> &nestedList) { int size = nestedList.size(); for (int i = (size - 1); i >= 0; i--){ lists.push(nestedList[i]); } } int next() { NestedInteger cur = lists.top(); lists.pop(); return cur.getInteger(); } bool hasNext() { while(!lists.empty()){ NestedInteger cur = lists.top(); if (!cur.isInteger()){ lists.pop(); vector<NestedInteger> tmplist = cur.getList(); int len = tmplist.size(); for (int i = (len - 1); i >= 0; i--){ lists.push(tmplist[i]); } } else{ return true; } } return false; } }; * Your NestedIterator object will be instantiated and called as such: * NestedIterator i(nestedList); * while (i.hasNext()) cout << i.next(); */
|
参考资料: https://discuss.leetcode.com/topic/41846/concise-c-without-storing-all-values-at-initialization