SWE · Coding

嵌套整数深度加权:结构遍历与字符串解析

顶层整数权重1,每嵌套一层加1,处理负数、多位数及语法错误。

题目重点:顶层整数权重1,每嵌套一层加1,处理负数、多位数及语法错误。

题意与假设

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

  • 语法为list=[value,...],value为十进制整数或list;允许空列表与空白,不允许尾逗号、浮点数。
  • 根必须是列表;任意精度整数。递归示例用于有限深度,极深输入需显式栈。

解题路线

  1. 已有嵌套结构时DFS(value,depth)累加整数×depth;BFS逐层对整数求和后乘层号也成立。
  2. 字符串版本除了记录深度,还要验证值、逗号和结束括号的语法。仅遇到数字就加权的扫描会把[1 2]等非法输入当成正常。
  3. 递归下降让parse_list(depth)消费一个完整列表并返回其加权和。遇到嵌套列表传depth+1;整数先完整解析再乘当前depth。

手动走一遍

[3,8,[2,14],[2,[91]]]得到3+8+2×2+14×2+2×2+91×3=320。[2,[91]]得到2+182=184;[-12,[],[3]]得到−12+6=−6。

Python 参考实现

下面的代码按上文假设实现,适合本地运行并追加自己的测试用例。

代码区可横向滚动;使用键盘时,先聚焦代码区再按方向键查看。

def weighted_sum(text):
    i = 0

    def spaces():
        nonlocal i
        while i < len(text) and text[i].isspace():
            i += 1

    def parse_list(depth):
        nonlocal i
        spaces()
        if i == len(text) or text[i] != '[':
            raise ValueError("expected list")
        i += 1
        spaces()
        if i < len(text) and text[i] == ']':
            i += 1
            return 0
        total = 0
        while True:
            spaces()
            if i < len(text) and text[i] == '[':
                total += parse_list(depth + 1)
            else:
                start = i
                if i < len(text) and text[i] == '-':
                    i += 1
                digits = i
                while i < len(text) and '0' <= text[i] <= '9':
                    i += 1
                if i == digits:
                    raise ValueError("expected integer")
                total += int(text[start:i]) * depth
            spaces()
            if i == len(text):
                raise ValueError("unclosed list")
            if text[i] == ']':
                i += 1
                return total
            if text[i] != ',':
                raise ValueError("expected separator")
            i += 1
    result = parse_list(1)
    spaces()
    if i != len(text):
        raise ValueError("trailing content")
    return result

复杂度

O(m)字符扫描时间(整数解析/大数运算位成本另计);O(h)递归栈,h为深度。BFS空间是待处理最大宽度,未必比DFS小。

易错点与追问

容易失分的边界

  • 不要把打印缺失乘号的31/81当成三十一和八十一。
  • BFS能避免递归栈溢出,但字符串语法验证仍需栈或解析状态,不能直接声称O(1)完整验证。

继续深挖

  • 若权重反过来由最大深度决定,怎样先求深度或累计各层贡献?
  • 显式栈如何同时验证逗号与空列表,限制恶意输入深度及数字长度?
✓已复制微信号!