python - 使用 ArrayStack 递归地展平嵌套列表
问题描述
编写一个迭代函数,将嵌套列表展平,同时使用一个 ArrayStack 及其定义的方法保留其值的从左到右的顺序。也就是说,您不应该直接访问实现中的底层数组。不要使用任何辅助函数或更改函数签名。
此外,不要创建除ArrayStack
.
前任)
lst = [ [[[0]]], [1, 2], 3, [4, [5, 6, [7]], 8], 9]
lst_flat = flatten_list(lst)
print(lst_flat)
# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
我用递归解决了上面的问题(我知道它不需要递归),但我想知道如何以更优化的方式用递归解决这个问题?因为,我认为我的实现在时间和空间使用方面非常薄弱。
这是我的代码:
def flatten_list(lst):
s = ArrayStack()
for i in range(len(lst)-1, -1, -1):
if isinstance(lst[i], int):
s.push(lst[i])
lst.pop()
else:
for val in reversed(flatten_list(lst.pop())):
s.push(val)
while not s.is_empty():
lst.append(s.pop())
return lst
这是ArrayStack
我使用的实现
class ArrayStack:
def __init__(self):
self.data = ArrayList()
def __len__(self):
return len(self.data)
def is_empty(self):
return len(self) == 0
def push(self, val):
self.data.append(val)
def top(self):
if (self.is_empty()):
raise Exception("Stack is empty")
return self.data[-1]
def pop(self):
if (self.is_empty()):
raise Exception("Stack is empty")
return self.data.pop()
解决方案
推荐阅读
- sql - 使用 DO、CREATE FUNCTION 等时,$$ 是什么意思?
- angularjs - 每次使用 $route.reload() 时,如何防止我的自定义指令被编译/执行
- swift - 我可以知道代码有什么问题吗,因为它一次又一次地调用函数并导致无限循环
- office-js - 获取用户编辑excel文档的信息
- pandas - pandas 所有指数的平均 bin 值
- java - Spring boot JPA - 延迟加载不适用于一对一映射
- powershell - 在 PowerShell 中使用 Where-Object 计数过滤 (xml-)Data ...
- php - array_column 在 PHP 5.6 中返回空数组
- python - 抽象 DGRAM 套接字,C 服务器和 Python 客户端,连接被拒绝
- java - 如何从 guava cacheloader 获取缓存的值并更新值而不更改缓存中的值?