題目連結
考驗著你對於 stack 和 iterator 的應用能力!
AC Code
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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
|
#ifdef LOCAL
#include <bits/stdc++.h>
using namespace std;
/**
* // 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
vector<NestedInteger> &getList();
};
#endif
static int __initialSetup = []()
{
std::ios::sync_with_stdio(false);
cin.tie(NULL);
return 0;
}
();
// we might have list-in-list
class NestedIterator
{
private:
stack<vector<NestedInteger>::iterator> s; // pos
stack<vector<NestedInteger>::iterator> se;
public:
NestedIterator(vector<NestedInteger> &nestedList)
{
if ((int)nestedList.size() > 0) {
s.push(nestedList.begin());
se.push(nestedList.end());
}
}
int next()
{
int ret = s.top()->getInteger();
s.top()++;
return ret;
}
bool hasNext()
{
// set s.top() to the next answer position
while (s.size() > 0) {
if (s.top() == se.top()) {
s.pop();
se.pop();
} else {
if (s.top()->isInteger() == false) {
auto it = s.top();
s.top()++;
s.push(it->getList().begin());
se.push(it->getList().end());
} else {
return true;
}
}
}
return false;
}
};
/**
* Your NestedIterator object will be instantiated and called as such:
* NestedIterator i(nestedList);
* while (i.hasNext()) cout << i.next();
*/
#ifdef LOCAL
int main()
{
return 0;
}
#endif
|