-
Notifications
You must be signed in to change notification settings - Fork 1
/
LC341-Flatten-Nested-List-Iterator.py
134 lines (109 loc) · 3.97 KB
/
LC341-Flatten-Nested-List-Iterator.py
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
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
"""
You are given a nested list of integers nestedList. Each element is either
an integer or a list whose elements may also be integers or other lists.
Implement an iterator to flatten it.
Implement the NestedIterator class:
NestedIterator(List<NestedInteger> nestedList) Initializes the iterator with
the nested list nestedList.
int next() Returns the next integer in the nested list.
boolean hasNext() Returns true if there are still some integers in the nested
list and false otherwise.
Example 1:
Input: nestedList = [[1,1],2,[1,1]]
Output: [1,1,2,1,1]
Explanation: By calling next repeatedly until hasNext returns false, the order
of elements returned by next should be: [1,1,2,1,1].
Example 2:
Input: nestedList = [1,[4,[6]]]
Output: [1,4,6]
Explanation: By calling next repeatedly until hasNext returns false, the order
of elements returned by next should be: [1,4,6].
Constraints:
(*) 1 <= nestedList.length <= 500
(*) The values of the integers in the nested list is in the range [-10^6, 10^6].
"""
# """
# This is the interface that allows for creating nested lists.
# You should not implement it, or speculate about its implementation
# """
# class NestedInteger:
# def isInteger(self) -> bool:
# """
# @return True if this NestedInteger holds a single integer, rather than a nested list.
# """
#
# def getInteger(self) -> int:
# """
# @return the single integer that this NestedInteger holds, if it holds a single integer
# Return None if this NestedInteger holds a nested list
# """
#
# def getList(self) -> [NestedInteger]:
# """
# @return the nested list that this NestedInteger holds, if it holds a nested list
# Return None if this NestedInteger holds a single integer
# """
from typing import List
class NestedInteger:
def __init__(self, entry):
if isinstance(entry, int):
self._integer = entry
self._list = None
else:
self._integer = None
self._list = entry
def isInteger(self) -> bool:
"""
@return True if this NestedInteger holds a single integer, rather than a nested list.
"""
return isinstance(self._integer, int)
def getInteger(self) -> int:
"""
@return the single integer that this NestedInteger holds, if it holds a single integer
Return None if this NestedInteger holds a nested list
"""
return self._integer
def getList(self) -> List["NestedInteger"]:
"""
@return the nested list that this NestedInteger holds, if it holds a nested list
Return None if this NestedInteger holds a single integer
"""
return self._list
class NestedIterator:
def __init__(self, nestedList: List["NestedInteger"]):
self.nestedList = nestedList
self.current_lst = []
self.next_item = None
def next(self) -> int:
if not self.hasNext():
raise
ans = self.next_item
self.next_item = None
return ans
def hasNext(self) -> bool:
if self.next_item is not None:
return True
while self.current_lst:
item = self.current_lst.pop(0)
if isinstance(item, int):
self.next_item = item
return True
# it is a nestedInteger
n = item.getInteger()
if n is not None:
self.next_item = n
return True
lst = item.getList()
self.current_lst = lst + self.current_lst
if self.nestedList:
nested_lst = self.nestedList.pop(0)
n = nested_lst.getInteger()
if n is not None:
self.next_item = n
return True
self.current_lst = nested_lst.getList()
return self.hasNext()
return False
# Your NestedIterator object will be instantiated and called as such:
# i, v = NestedIterator(nestedList), []
# while i.hasNext(): v.append(i.next())