题目链接:https://leetcode-cn.com/problems/flatten-nested-list-iterator/
题目描述
给定一个嵌套的整型列表。设计一个迭代器,使其能够遍历这个整型列表中的所有整数。
列表中的项或者为一个整数,或者是另一个列表。
示例 1:
输入: [[1,1],2,[1,1]]
输出: [1,1,2,1,1]
解释: 通过重复调用 next 直到 hasNext 返回false,next 返回的元素的顺序应该是: [1,1,2,1,1]。
示例 2:
输入: [1,[4,[6]]]
输出: [1,4,6]
解释: 通过重复调用 next 直到 hasNext 返回false,next 返回的元素的顺序应该是: [1,4,6]。
思路
解这道题需要好好看清楚初始代码里面注释的内容,大致如下:
- 对于 bool isInteger() const;如果此NestedInteger包含单个整数而不是嵌套列表,则返回true。
- 对于 int getInteger() const;返回此NestedInteger保存的单个整数(如果它包含单个整数),如果此NestedInteger包含嵌套列表,则结果未定义。
- 对于const vector < NestedInteger >&getList()const;如果它拥有嵌套列表,则返回此NestedInteger包含的嵌套列表,如果此NestedInteger包含单个整数,则结果未定义
代码
1 用队列存储所有元素
将所有嵌套列表的元素都解开;速度较慢;
/*
* 存下所有元素
*/
class NestedIterator {
queue<int> q;
public:
NestedIterator(vector<NestedInteger> &nestedList) {
getAll(nestedList);
}
void getAll(const vector<NestedInteger> &nestedList){
for(auto m:nestedList){
if (m.isInteger())
q.push(m.getInteger());
else{
getAll(m.getList());
}
}
}
int next() {
int val = q.front();
q.pop();
return val;
}
bool hasNext() {
return !q.empty();
}
};
2 用栈存储
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;
};
3 存储迭代器
class NestedIterator {
public:
NestedIterator(vector<NestedInteger> &nestedList) {
begins.push(nestedList.begin());
ends.push(nestedList.end());
}
int next() {
hasNext();
return (begins.top()++)->getInteger();
}
bool hasNext() {
while (begins.size()) {
if (begins.top() == ends.top()) {
begins.pop();
ends.pop();
} else {
auto x = begins.top();
if (x->isInteger())
return true;
begins.top()++;
begins.push(x->getList().begin());
ends.push(x->getList().end());
}
}
return false;
}
private:
stack<vector<NestedInteger>::iterator> begins, ends;
};