编程题--扁平化嵌套列表迭代器

来源leetcode: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]。

参考思路:

首先,迭代器惰性的。惰性是指如果需要获取当前的值,那就去获取当前值,不会把所有的值都去迭代。所以使用递归的方式获取到全部的值不是一个好方法。

好的思路就是:在利用hasNext函数判断是否有下一个整数时将第一个元素展开直到它为整数。(如果第一个元素就是整数就不用展开)。然后调用next函数获取第一个整数,然后将该第一个整数从迭代器的列表中删除(为了每次都从第一个位置获取要返回的值)。

参考:https://leetcode-cn.com/problems/flatten-nested-list-iterator/solution/shu-de-bian-li-kuang-jia-ti-mu-bu-rang-wo-zuo-shi-/

python实现:

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
class NestedIterator:
def __init__(self, nestedList: [NestedInteger]):
self.nestedList = nestedList

def next(self) -> int:
next_value = self.nestedList[0]
## 删除该值
self.nestedList.pop(0)
return next_value
def hasNext(self) -> bool:
## 迭代去发现整数
while len(self.nestedList) > 0 and not self.nestedList[0].isInteger():
value = self.nestedList[0].getList() ## 获取到列表
## 在迭代器中删除该嵌套列表value
self.nestedList.pop(0)
## 将嵌套列表里面的值再加入到迭代器的列表中(展开的值重新加入到列表)
i = len(value) - 1
while i > -1:
self.nestedList.insert(0, value[i])
i -= 1
## 迭代后
## 存在整数
if len(self.nestedList) > 0:
return True
else: ## 不存在整数
return False