SWE · Coding

Meta 嵌套列表Depth Sum:层级约定与迭代遍历

累加整数乘所在深度,明确根列表深度、空列表和深层输入的栈空间。

题目重点:累加整数乘所在深度,明确根列表深度、空列表和深层输入的栈空间。

题意与假设

这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。

  • 训练Python list含int或list,根中的整数深度1,负数合法,空列表无贡献。输入为有限无环树,不含bool或其他对象。
  • 若题面给NestedInteger接口,替换取值/取children适配层,权重逻辑不变。反向权重是另一变体,不自动套用。

解题路线

  1. 栈存当前list的iterator和depth,遇整数加value×depth,遇child list压新iterator并depth+1;当前层耗尽后pop。
  2. 每个整数只在其所在层处理一次,深度来自沿路径进入列表次数,不由同层位置或已遍历元素数决定。
  3. 迭代器栈不flatten所有整数,也不把所有子项一次全压栈,辅助空间按最大depth而非最大width;输入本体空间另算。
  4. 空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对象或环怎样处理?共享列表重复出现是否重复计需要新的数据结构合同。
✓已复制微信号!