帆软前端一面:项目拷打、BFS 手撕与 AI 代码质量
- 轮次
- 一面
- 时间
- 2026-09
- 来源
- 牛客网
《面试题目》
- 简单介绍个人背景(无标准自我介绍环节)。
- 项目拷打(程度较轻)。
- 少量八股。
- 你们怎么保证 AI 生成代码的质量与正确性?
- 手撕:BFS。
- 手撕:数组转树。
- 反问:业务方向是什么?面试流程是怎样的?AI token 会报销吗?
《参考解析》
AI 代码质量怎么答:不要只说”我会 review 一遍”。可以按四层讲:① 给 AI 的输入要收敛——明确目录结构、数据模型、既有代码风格和改动边界,别让它自由发挥;② 产出必须过确定性检查——编译、类型检查、lint、单元测试,能自动发现的问题不用人眼看;③ 关键路径人工 review,重点看边界条件、异常处理、并发与安全,而不是格式;④ 用测试反推正确性——先让它补测试再改代码,或者对修改前后的行为做对比。最后补一句”AI 提升的是产出速度,不改变正确性标准”,这句是加分项。
BFS 手撕注意点:用队列(JS 里用数组 + 头指针或 shift,注意 shift 是 O(n),数据量大时性能差)。模板是:起点入队并标记已访问 → 循环取队首 → 遍历邻居,未访问的标记后入队。易错点:入队时就标记 visited(出队时标记会导致同一节点被重复入队、复杂度和内存都恶化)、网格/树场景要判空、以及层序输出时要先记录当前层长度。
数组转树:常见做法是用一次遍历建 map(id -> node)再挂父子,复杂度 O(n)。要点:① 先建 map 避免 O(n²) 的嵌套查找;② 遍历时如果 parentId 在 map 里还没出现(乱序数据),要么两遍遍历(先全建节点再挂),要么在处理完后补挂孤儿节点;③ 根节点判定(parentId 为 null/0/不在集合里);④ 挂载时不要直接改原对象引用导致循环引用。如果输入是「扁平数组 + 每项带 parentId」,也可以用栈模拟,但 map 法最直观。
反问环节:面试官花了十多分钟讲业务(数据处理方向,官网可看)和流程(三面技术 + HR,三面据说更看智商类问题),还提到组里每月 150 的 AI 额度——这类信息值得记下来,因为它反映了团队对 AI 工具的真实投入程度。反问时优先问「这个岗位在前三个月最重要的产出是什么」「团队现在最缺的能力是什么」,比问流程细节更有信息量。