一、面试总体概述
1. 1 案例背景
一份纯笔试复盘。题型为 AI 题 1 道 + 编程题 2 道 + 选择题 20 道,整体难度偏高。两道编程题都给出了完整解题思路(余数 DP、分层图 + 双源会合),是这份面经最有价值的部分。
1. 2 基本信息
- 公司:行吟信息科技(上海)有限公司
- 岗位:算法工程师
- 招聘类型:校招
- 用工形式 / 部门:直招
- 面试形式:线上笔试
- 面试轮次:1 轮
- 题目数量:共 2 题,均附参考答案
- 整体难度:★★★★☆ 偏难
- 是否参加笔试:是
- 笔试形式:AI 题 1 道 + 编程题 2 道 + 选择题 20 道
- 题型构成:AI 题 1 + 编程题 2 + 选择题 20
1. 3 高频考点
| 考点 | 分类 | 出现轮次 | 次数 |
| --- | --- | --- | --- |
| 余数 DP / 同余背包 | 算法与数据结构 | 笔试 | 1 |
| 分层图与多约束最短路 | 算法与数据结构 | 笔试 | 1 |
1. 4 备考建议
| 优先级 | 易失分点 | 准备动作 |
| --- | --- | --- |
| P0 | 题面细节缺失(是否允许前导零、时间与金钱能否直接相加) | 补全题面表述,或在下次遇到同类题时先向面试官确认边界 |
| P1 | 余数 DP 是高频模板 | 整理成模板题,扩展到「和能被 k 整除的子数组」「子序列和 mod k」等变体 |
| P1 | 笔试选择题没有记录 | 20 道选择题零记录,是本条最大的信息缺口,后续整理可补上考点分布 |
二、第 1 轮:笔试
2. 1 面试形式与时长
- 轮次名称:笔试
- 面试类型:笔试
- 形式:线上
- 本轮题量:2 题
2. 2 重点考查维度
算法与数据结构 —— 本组 2 道题
2. 3 面试真题与参考答案
Q1 子序列整除 k 计数
算法与数据结构 · 动态规划
参考答案
设 dp[r] 表示「扫描到当前位置时,余数为 r 的非空子序列个数」。逐个字符推进,对数字 d 有三条来源:不选(沿用原 dp)、单独成序列(余数 d % k 加 1)、拼在已有子序列后面(余数 (r×10 + d) % k 累加 dp[r])。答案取最终的 dp[0]。
MOD = 10**9 + 7
def count_divisible(s, k):
dp = [0] * k
for ch in s:
d = int(ch)
ndp = dp[:] # 不选:沿用上一轮
ndp[d % k] = (ndp[d % k] + 1) % MOD # 单独成序列
for r in range(k): # 拼在已有子序列后面
if dp[r]:
nr = (r * 10 + d) % k
ndp[nr] = (ndp[nr] + dp[r]) % MOD
dp = ndp
return dp[0]
复杂度:时间 O(nk),空间 O(k)(滚动数组)。
作答要点:①必须用 dp 的副本更新,否则同一个字符会被重复使用;②k = 1 时所有非空子序列都满足,可用来快速自测;③数字含 0 时,前导零是否影响计数需先向面试官确认口径。
题目未给完整约束,作答前建议先确认三件事:是否允许前导零、是否允许空子序列、模数是否固定
余数DP背包同余
Q2 双人路径时间金钱联合最优
算法与数据结构 · 图论
参考答案
关键洞察是:时间与金钱两个目标相互耦合,不能拆成两次独立最短路,必须做联合建模。
做法分四步:
1. 因为每条边耗时都是 1,先按步数做 BFS,求出 s、t 到每个点的最短步数
2. 枚举会合点 m,两人到达 m 的时间取 max,记为 L
3. 在「不超过 L 步」的约束下,求 s→m、t→m 的最小金钱(分层图上的 DP)
4. 从 m 到终点跑一次 Dijkstra,边权用「时间 + 金钱」的联合代价,对所有 m 取最小值
核心:分层图 + 双源会合 + 联合代价。
作答要点:①说清为什么不能分开算——分开会把两条互不兼容的路径拼在一起,得到不可行的解;②联合代价的权重如何确定,要先和面试官确认时间与金钱的换算关系;③先到的同学能否等待、等待是否计入时间成本,会直接改变答案。
题面约束不完整,作答时建议先确认:两人是否必须同时到达、先到能否等待、时间与金钱如何换算权重
分层图Dijkstra多目标最短路
备考提示
备考阶段,我发现很多同学容易陷入「不知道从哪准备」的困境。机会永远留给有准备的人,希望读到这篇文章的每一位同学都能拿到心仪的offer。
以上内容整理自学员和应届同学反馈的真实笔试经验,结合行吟信息科技(上海)有限公司的最新考情整理,仅供参考学习。祝各位求职者顺利拿到心仪offer!