面灵AI→

百度 AIGC 多模态智能体算法工程师一面:Agent 框架选型与手撕最大子数组乘积

轮次
一面
时间
2026-09
来源
牛客网

《面试题目》

一面

  1. 个人背景与实习经历
  2. 介绍实习
  3. 年级与实习起点
  4. Agent 宿主与框架选型
    • 使用成熟产品当宿主还是自己搭框架
    • 是否只依赖 AI Coding 工具完成实现
  5. 手撕:最大连续子数组乘积,额外空间 O(1)
    • 明确题目:数组含正负数,求最大连续子数组乘积,额外空间 O(1)
    • 如何处理负数导致最大值与最小值互换
    • 如何用动态规划维护最大、最小状态
    • 为什么两个状态可以一遍遍历完成
    • 代码实现与样例验证
    • 修复实现中的状态转移问题
    • 如何把数组状态压缩到 O(1) 额外空间
  6. 反问团队业务与素材用途
    • 团队主要负责哪些业务
    • 生产的素材用于哪些 To B 或 To C 场景
  7. 实习时间与课程安排
    • 大三是否有时间实习
    • 课程与期末考试如何安排
  8. 工作城市偏好
  9. 反问后续面试流程

《参考解析》

  1. 最大连续子数组乘积的关键是「两个状态一起维护」:因为负数会让最大值翻成最小值、最小值翻成最大值,所以不能只记「以当前位置结尾的最大乘积」,要同时记 maxEnd 和 minEnd。转移时先用上一轮的 maxEnd、minEnd 和当前元素 x 三者比较:新的 maxEnd = max(x, maxEnd * x, minEnd * x),新的 minEnd = min(x, minEnd * x, maxEnd * x)——注意两边的式子必须用旧的值,实现时要么先存临时变量,要么一次算完再赋值,这就是很多人在这个题上写出 bug 的地方。答案在遍历过程中取 maxEnd 的历史最大值。

  2. 几个必答的追问:为什么两个状态就能一遍扫完——因为「以 i 结尾的最优解」只依赖「以 i-1 结尾的最优解」,子问题之间是链式的,天然满足动态规划的无后效性,所以不需要前缀和或二分之类的额外结构。x 本身单独参与比较是处理 0 的关键:遇到 0 时子数组必须断开,maxEnd 与 minEnd 都归零或归 1 都行,但写成 max(x, ...) 的形式最不容易错。边界要主动说:数组全为 0、只有一个元素、正负交替(如 [-2, 3, -4])、以及结果为负的情况(不能返回 1,要返回真实的最大乘积)。O(1) 额外空间这件事本身就是「滚动变量代替数组」——把 dp[i] 换成三个变量,这也是面试官要求 O(1) 时真正想听的表述。

  3. Agent 宿主与框架选型怎么答:这题想听的是取舍标准。用成熟产品(如 Dify、Coze、扣子这类平台)当宿主,换来的是开箱可用的编排、知识库、观测与部署,代价是定制能力受限、模型与数据要过第三方、复杂工具链和权限模型不好改;自建框架换来的是完全的控制权和可私有化部署,代价是要自己把重试、并发、记忆、评测、可观测这些轮子补齐。合理的判断维度是:数据敏感度(能不能出内网)、流程复杂度(有没有人工审批、跨系统写操作)、迭代速度要求、以及团队有没有人力维护。稳妥的答法是「先用平台做验证,等流程稳定且出现平台撑不住的定制需求再逐步替换核心链路」,而不是非黑即白。

  4. 「是否只依赖 AI Coding 工具完成实现」怎么答:不要简单说「是」——那听起来像没有判断力。可以这样组织:用 AI Coding 提速的是样板代码、接口胶水、单元测试和重构,但有三件事必须自己把关——架构与边界划分、prompt 与工具描述这类语义设计、以及结果验证;并且要能说清自己怎么验证(先写测试或先定义验收样例,再让工具产出,最后手工核对关键路径)。如果能补一个具体例子——「它生成的某段状态转移有 bug,我是怎么通过某个用例定位出来的」——这题就从表态变成了能力证明。