题目重点:累加整数乘所在深度,明确根列表深度、空列表和深层输入的栈空间。
题意与假设
这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。
- 训练Python list含int或list,根中的整数深度1,负数合法,空列表无贡献。输入为有限无环树,不含bool或其他对象。
- 若题面给NestedInteger接口,替换取值/取children适配层,权重逻辑不变。反向权重是另一变体,不自动套用。
解题路线
- 栈存当前list的iterator和depth,遇整数加value×depth,遇child list压新iterator并depth+1;当前层耗尽后pop。
- 每个整数只在其所在层处理一次,深度来自沿路径进入列表次数,不由同层位置或已遍历元素数决定。
- 迭代器栈不flatten所有整数,也不把所有子项一次全压栈,辅助空间按最大depth而非最大width;输入本体空间另算。
- 空child list只发生一次push/pop,不改变兄弟整数深度。深链用显式栈避免递归上限,数值0也要视整数而不是空。
手动走一遍
[1,[2,[3]],4]贡献1×1+2×2+3×3+4×1=18;[[],[−2]]为−4。3000层包住0仍结果0,不能因为值0就跳过类型校验。
Python 参考实现
下面的代码按上文假设实现,适合本地运行并追加自己的测试用例。
代码区可横向滚动;使用键盘时,先聚焦代码区再按方向键查看。
def depth_sum(nested):
"""Nested ints/lists; root integers depth1; negatives allowed; no cycles."""
stack=[(iter(nested),1)];total=0
while stack:
iterator,depth=stack[-1]
try:item=next(iterator)
except StopIteration:stack.pop();continue
if type(item) is int:total+=item*depth
elif isinstance(item,list):stack.append((iter(item),depth+1))
else:raise TypeError('int/list only')
return total
复杂度
O(M)访问时间,M含list节点和整数,辅助O(depth)iterator栈,整数乘加位成本另计。仅按整数数量忽略大量空list会低估工作。
易错点与追问
容易失分的边界
- 根整数深度从0开始导致整体少一层权重。
- 递归把所有大深度输入都称安全。
继续深挖
- 反向深度权重需要知道最深整数层,可分层累计或两遍,空列表是否影响maxDepth先确认。
- 共享child对象或环怎样处理?共享列表重复出现是否重复计需要新的数据结构合同。
