SWE(汇总帖未给具体岗位) · Technical Coding 题型汇总

Netflix 简化 jq:JSON 路径与 Wildcard 查找

从面经汇总公开的 `.`, `.name.email`, `.*.email.*` 三个查询形式出发,实现 JSON 路径逐层扩展、缺失分支跳过及 wildcard 输出顺序。

题目重点:从面经汇总公开的 `.`, `.name.email`, `.*.email.*` 三个查询形式出发,实现 JSON 路径逐层扩展、缺失分支跳过及 wildcard 输出顺序。

题意与假设

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

  • 训练版输入是已解析 JSON,返回匹配值列表;题目没有规定 stdout JSON 文本格式。`.` 返回包含原文档的单元素列表。
  • 路径 segment 只能是普通 object key 或 `*`;`*` 枚举对象 value 或数组元素,按输入顺序输出;不支持真实 jq 的过滤器、管道、字符串转义、负索引等。
  • 缺失路径返回空列表;表达式格式非法抛 ValueError。对象键中含点号的情况不支持转义,须另设语法。

解题路线

  1. 解析路径为 segment 序列,初始候选只有根 JSON。每读一段,对每个当前候选分别应用:普通键只在 dict 中查该键,wildcard 对 dict 遍历 values、对 list 遍历元素;把所有结果拼成下一层候选。
  2. 每层只处理当前位置的候选,不递归遍历整棵 JSON;`.*.email.*` 是根节点子项→其中 email 字段→该 email 下所有子项,不是任意深度通配。
  3. 保留数组和对象迭代顺序,便于测试和稳定输出;若要流式读取超大文档,解析器需支持事件流与路径自动机,而不是先 `json.loads` 全量入内存。

手动走一遍

训练例 `{'alice':{'email':['a@x','a@y']},'bob':{'email':['b@x']}}` 上 `.*.email.*` 返回 `['a@x','a@y','b@x']`;`.alice.email` 返回含一个 list 的结果,和进一步加 `.*` 后得到 list 元素不同。

Python 参考实现

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

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

def query_path(document, expression):
    """Training subset: '.', named object keys, and '*' over object/list children."""
    if expression == ".":
        return [document]
    if not expression.startswith(".") or not expression[1:]:
        raise ValueError("path must start with '.'")
    parts = expression[1:].split(".")
    if any(not part for part in parts):
        raise ValueError("empty path segment")
    current = [document]
    for part in parts:
        next_values = []
        for value in current:
            if part == "*":
                if isinstance(value, dict):
                    next_values.extend(value.values())
                elif isinstance(value, list):
                    next_values.extend(value)
            elif isinstance(value, dict) and part in value:
                next_values.append(value[part])
        current = next_values
    return current

复杂度

路径深度 D,各层候选扩展总访问节点数 V,时间 O(V),中间结果最多 O(W) 个节点引用,W 为最大一层候选宽度;输入 JSON 本身已占 O(文档大小)。通配符多层连用可能令 V 接近整棵树大小。

易错点与追问

容易失分的边界

  • 把 `*` 当正则通配整条 JSON path,误匹配任意深度。
  • `.` 误返回文档的子元素,而不是根文档。
  • 普通键在数组上隐式搜索所有元素,违反已定义的逐段规则。
  • 声称支持完整 jq 语言,而代码只实现三个题面形式的子集。
  • 没有处理缺失分支,访问不存在键抛 KeyError。

继续深挖

  • 如何为对象键里的点号和星号设计转义?
  • 若要求 `..` 递归下降,如何避免循环或重复结果?
  • 对百 GB JSON 流怎么实现低内存输出?
✓已复制微信号!