题目重点:顶层整数权重1,每嵌套一层加1,处理负数、多位数及语法错误。
题意与假设
这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。
- 语法为list=[value,...],value为十进制整数或list;允许空列表与空白,不允许尾逗号、浮点数。
- 根必须是列表;任意精度整数。递归示例用于有限深度,极深输入需显式栈。
解题路线
- 已有嵌套结构时DFS(value,depth)累加整数×depth;BFS逐层对整数求和后乘层号也成立。
- 字符串版本除了记录深度,还要验证值、逗号和结束括号的语法。仅遇到数字就加权的扫描会把[1 2]等非法输入当成正常。
- 递归下降让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)完整验证。
继续深挖
- 若权重反过来由最大深度决定,怎样先求深度或累计各层贡献?
- 显式栈如何同时验证逗号与空列表,限制恶意输入深度及数字长度?
