这两年AI岗位的热度一点没降,尤其是大模型相关的方向,几乎把整个算法岗的面试节奏都带快了。2025年开春,我陆续帮团队做了几十场技术面试,也跟不少从京东面出来、或者刚入职的朋友聊过,一个很直观的感受是:面试题的问法变了,深度变了,光靠刷题已经不顶用了。网上能搜到的“京东算法/AI岗面试题”大多是零零散散的回忆版,没有体系,也没有人讲清楚“为什么这么考”。这篇文章我就从面试官和候选人的双重视角,把2025年京东算法/AI岗的高频考点拆开揉碎,讲清楚每类题背后的真实考察意图,以及你怎么准备才不白费功夫。
这篇文章适合正在准备大厂算法岗校招或社招的朋友,也适合那些想系统梳理自己算法功底的工程师。文章里不会只列题目,我会把每一类高频题的原理、推导过程、面试追问方向,还有我自己在面试中看到的典型翻车现场都写出来。你可以把这篇文章当成一份备考地图,按照章节往下看就行。
1. 2025年京东算法岗面试:到底在考什么
1.1 我对京东算法岗面试的整体印象
京东的算法岗分布很广,搜索、推荐、广告、供应链、运筹优化、CV、NLP、大模型这些方向都有。不同部门的面试风格其实差别挺大,但如果非要提炼一个共同点,那就是**“基础不牢,地动山摇”**。相比某些公司上来就聊项目聊得天花乱坠,京东的面试官普遍更愿意在数据结构、经典算法、机器学习理论上深挖。这不是说项目不重要,而是他们默认“项目可以包装,但基础题做不了假”。
从我观察到的面试流程来看,京东算法岗一般是3到4轮技术面加一轮HR面。校招的第一轮基本是算法题加基础知识问答,第二轮开始才侧重项目和场景设计,第三轮往往是交叉面或者部门负责人面,更多聊方案选型和业务理解。社招的话,第一轮就会直接切入项目和系统设计,算法题更像是“开胃菜”,但别小看这道开胃菜,很多候选人就是挂在第一轮的。
1.2 2025年面试风向的三大变化
和两三年前相比,2025年的面试题有几个明显变化。
第一个变化:大模型相关内容从“加分项”变成了“必考题”。以前问Transformer还只是问个 attention 公式,现在会追问位置编码的细节、RoPE和ALiBi的区别、LoRA为什么有效、RAG的召回链路怎么设计。面试官默认你对大模型有基本认知,哪怕你简历上写的是传统CV方向,也得能说出个一二三。
第二个变化:代码题不再只是“写出答案”,而是要讲清楚“为什么”。我面试的时候最喜欢干的一件事,就是候选人写完代码之后,让他讲一下时间复杂度的推导过程,或者问“这个写法在极端输入下会出什么问题”。很多候选人能写出二分查找,但一问到int mid = (left + right) / 2在什么情况下会溢出,就卡住了。这种细节才是区分度所在。
第三个变化:场景题和项目的结合更紧密了。京东的业务场景太丰富了,搜索排序、供应链库存优化、物流路径规划、营销转化率预估,每个场景背后都有对应的算法问题。面试官会把题目包装在一个具体业务背景里,让你设计解决方案。这一块没有标准答案,但很考验你对算法落地边界的理解。
提示:准备京东算法岗面试,不要抱侥幸心理。那些“背个八股就能过”的时代早就过去了,面试官问的每一道题,背后都在考察你的逻辑思维、数学功底和工程判断力。
2. 数据结构与基础算法:高频必刷题拆解
2.1 KMP算法:next数组的两种求法,别再背模板了
KMP是面试题里出现频率高到离谱的题目。我在面试候选人的时候,十个人里有八个能说出“KMP是用来做字符串匹配的”“时间复杂度是O(m+n)”,但真让他手写一个next数组,再拿模式串p = "abacaba"现场算一遍,挂掉的比例非常高。
先说清楚next数组的定义。KMP的核心思想是:当匹配失败时,不要从头开始,而是利用已经匹配的部分信息,把模式串向右滑动尽可能远的距离。这个“部分匹配信息”就存在next数组里。next[j]的经典定义是:模式串中p[0...j]这个子串的最长相等前后缀的长度(有些资料定义是减一后的偏移值,这里统一用“长度”定义)。
拿p = "abacaba"来算。先看每个子串:
p[0] = "a",前后缀为空,next[0] = 0p[0..1] = "ab",前缀"a",后缀"b"不相等,next[1] = 0p[0..2] = "aba",前缀"a"、后缀"a"相等,最长长度是1,next[2] = 1p[0..3] = "abac",前缀和后缀的最长相等长度是0,next[3] = 0p[0..4] = "abaca",最长相等等于1(前缀"a"、后缀"a"),next[4] = 1p[0..5] = "abacab",这里注意,前缀"ab"和后缀"ab"相等,长度是2,next[5] = 2p[0..6] = "abacaba",最长的相等前后缀是"aba",长度3,next[6] = 3
所以这个模式串的next数组就是[0, 0, 1, 0, 1, 2, 3]。
如果面试官把next数组定义为“失配时j应该跳到哪”,那一般会让next[0] = -1,然后整体往右平移,这时候结果就变成了[-1, 0, 0, 1, 0, 1, 2]。两种定义本身没对错,但写代码之前一定要跟面试官确认清楚,不然很容易被扣分。
再说一个容易被追问的点:nextval优化。当p[j] == p[next[j]]时,如果失配发生在j,跳到next[j]后依然会失配,所以可以用nextval[j] = nextval[next[j]]进行递归优化。这个优化在笔试里不一定会考,但面试官很容易拿出来问“KMP还可以怎么优化”,如果你能说出来,印象分会高不少。
手写KMP的核心代码可以这么写:
vector<int> getNext(const string& p) { int m = p.size(); vector<int> next(m, 0); for (int i = 1, len = 0; i < m; ) { if (p[i] == p[len]) { next[i++] = ++len; } else { if (len > 0) len = next[len - 1]; else next[i++] = 0; } } return next; }这个写法的时间复杂度是O(m),关键在于使用了一个“回溯指针len”,它记录的是当前已匹配的前后缀长度。匹配阶段的代码类似,用两个指针分别遍历文本串和模式串,失配时把模式串指针跳到next数组对应位置。
注意:面试中手写KMP不要照搬模板,最好边写边把注释写清楚,比如失配时跳转的依据。这是面试官判断你“真会”还是“背模板”的重要依据。
2.2 排序算法:从快排到堆排,面试官真正想听到什么
排序算法是算法岗面试的“保留项目”,几乎没有人能躲过去。但2025年的面试不再满足于“背个时间复杂度表”,而是要求你现场推导、手写、并且能回答边界情况。
我梳理了一下京东算法岗面试里出现频率最高的排序题:
| 题目 | 高频追问点 | 考察意图 |
|---|---|---|
| 快排 | 为什么最坏是O(n²)?怎么避免?partition怎么优化? | 是否理解递归树退化 |
| 堆排 | 建堆的时间复杂度为什么是O(n)?为什么不稳定? | 是否理解堆调整的本质 |
| 归并排序 | 空间复杂度?求逆序对的变体怎么写? | 分治思想是否有深度 |
| 桶排序/计数排序 | 适用场景?数据分布有要求吗? | 是否懂得“因场景选算法” |
以快排为例,我面试时最爱问的一个问题是:“快排在最坏情况下是什么时候?”大多数候选人都能答“当数组已经有序的时候”。但如果我继续问“那为什么有序时会退化,随机选pivot能不能彻底解决问题”,能答好的人就少了一半。实际上,随机选pivot只能从概率上避免最坏情况,不能从理论上根除。真正根除最坏情况的办法是使用三数取中法或者BFPRT算法,但BFPRT因为常数太大,工程上反而很少用。
堆排序是我觉得面试里问得最“刁钻”的排序算法。建堆过程为什么是O(n)而不是O(n log n)?这个推导很多候选人答不上来。实际上,堆排序的建堆是从最后一个非叶子节点开始向下调整的,每一层节点的调整代价与该层节点高度成正比。总代价可以写成求和公式,经过等比数列求和之后收敛于O(n)。如果把这个推导过程写在白板上,会很加分。
手写堆排的核心是siftDown调整函数:
void siftDown(int[] arr, int n, int i) { while (true) { int maxPos = i; int left = 2 * i + 1; int right = 2 * i + 2; if (left < n && arr[left] > arr[maxPos]) maxPos = left; if (right < n && arr[right] > arr[maxPos]) maxPos = right; if (maxPos == i) break; swap(arr, i, maxPos); i = maxPos; } }另一道高频变体题是“求数组第K大元素”。这个题既可以借助快排的partition做到平均O(n),也可以借助大小为K的小根堆做到O(n log K)。面试官会继续追问“如果K远小于n选哪个?如果数据会动态增删呢?”动态场景就得用堆了,因为partition没法增量维护。
2.3 贪心与动态规划:高频题型的判断方法与思考框架
贪心和动态规划是算法岗笔试和面试中占比最大的题型,没有之一。京东的面试题库里,这两类题基本保持在40%以上的权重。但很多候选人准备的时候喜欢“刷题战术”,刷了很多题,真到面试遇到新题还是无从下手。我分享一下我自己带人准备时的一套判断框架。
什么样的问题适合用贪心?一句话回答:局部最优能推导出全局最优时才能用贪心。经典的区间调度问题(选最多的不重叠区间)就可以用贪心,因为按结束时间排序后,选最早结束的区间永远不亏,这个性质叫做“贪心选择性质”。
动态规划呢?动态规划适合两类问题:最优子结构问题和计数类问题。核心就两件事:定义状态、写状态转移方程。我见过太多候选人卡在“状态定义”这一步。一个实用的技巧是:先不考虑优化,暴力枚举所有可能,然后从中抽象出“在某个阶段、某个状态下的最优值/方案数”。这个抽象过程就是状态定义。状态定义一旦清楚,转移方程就是顺理成章的事。
下面整理几个京东面试中出现频率很高的DP题:
- 最长递增子序列:O(n²)的DP大家都会写,但面试官会追问“能不能优化到O(n log n)”。这个问题考的是“贪心+二分”的融合,需要一个额外的数组
d[i]保存长度为i的递增子序列的最小末尾值。 - 编辑距离:经典的二维DP,状态定义是
dp[i][j]表示字符串a的前i个字符转换成字符串b的前j个字符所需的最小操作数。这个题面试官经常会给一个实际场景,比如“搜索纠错中,用户输错了一个单词,怎么判断和哪个候选词最接近”。 - 背包问题变体:0-1背包、完全背包、多重背包,京东供应链方向的岗位特别喜欢考背包的变体。比如“仓库里有若干种商品,每种有体积和利润,货车容量有限,怎么装货利润最大”。
实操心得:我建议候选人不要只刷题,试着把每一道DP题的状态定义和转移方程写在纸上,然后自己口头推导一遍。面试的时候,你能不能用30秒把状态定义讲清楚,很大程度上决定了面试官对你的评价。
3. 机器学习与经典算法:理论功底决定上限
3.1 手推逻辑回归与SVM:公式推导背后考察的逻辑
机器学习基础是算法岗面试的“基本盘”,尤其是逻辑回归和SVM这两个算法,几乎每轮面试都会被问到。京东的面试官很少直接让你背公式,而是会从一个场景切入,然后一步步往下追问。
逻辑回归是面试官最喜欢的“第一问”,因为它足够基础,但又能往外延伸出很多知识点。常见的提问路径是这样的:
- “逻辑回归的损失函数是什么?”多数人能答出交叉熵。
- “为什么不能用均方误差MSE当损失函数?”这个问题就开始区分人了。正确答案是因为逻辑回归是sigmoid函数加线性组合,如果使用MSE,损失函数关于参数是非凸的,梯度下降很容易陷入局部最优;而交叉熵在这种结构下是凸函数,有全局最优解。
- “手推一下梯度表达式。”这时候你能不能在五分钟内把sigmoid求导、损失函数对w求梯度写清楚,就成了过关的关键。
SVM的追问就更加硬核了。常见的提问包括:“什么是支持向量?”“为什么要引入拉格朗日对偶?”“KKT条件是什么?”“核函数的作用是什么?”如果你在简历里写了“熟悉SVM”,那面试官很可能让你现场手推一遍线性SVM的对偶形式。这个过程并不复杂,但需要记清楚每个符号的含义,以及为什么要用对偶:
- 原始问题:
min 1/2 ||w||²,约束是y_i(w·x_i + b) >= 1 - 拉格朗日函数引入乘子
α_i >= 0 - 对w和b求偏导令其为0,代回原式
- 得到对偶形式:
max Σα_i - 1/2 ΣΣ α_i α_j y_i y_j x_i · x_j
对偶形式的价值在于,优化目标里只出现样本的内积x_i · x_j,这为后面的核技巧铺平了道路——把内积替换成核函数K(x_i, x_j),就能隐式地把样本映射到高维空间。
注意:手推公式的时候,不要只顾着写,要一边写一边解释每一步的含义。面试官愿意看到的是“有逻辑的推理”,而不是“背下来的默写”。
3.2 集成学习:GBDT与XGBoost的高频追问
在2025年,虽然大模型很热,但传统机器学习算法在实际业务中依然是中流砥柱。京东的搜索排序、广告CTR预估、营销响应用户预测这些场景,大量线上模型仍然以GBDT、XGBoost、LightGBM为主。所以集成学习的考点绝对绕不开。
先分清两个基础概念:Bagging和Boosting。Bagging的思路是“并行训练多个弱学习器,投票或平均”,代表是随机森林,核心价值是降低方差。Boosting的思路是“串行训练,每个学习器重点关注前面做错的样本”,代表是AdaBoost和GBDT,核心价值是降低偏差。
面试官问得最多的是GBDT和XGBoost的区别。这个问题的标准答案一般有这几层:
- 损失函数:GBDT只支持一阶导数信息,XGBoost使用了二阶泰勒展开,能更快地逼近真实损失。
- 正则项:XGBoost在目标函数中显式加入了叶子节点数量和叶子权重的L2正则,GBDT没有。
- 列抽样:XGBoost支持按特征列进行随机抽样,这个技术借鉴了随机森林,能降低过拟合,也加快了训练速度。
- 缺失值处理:XGBoost能自动学习缺失值的方向,把它分到增益更大的那个子节点。
- 并行化:XGBoost在特征粒度上支持并行,按特征预先排序并以块格式存储,训练速度更快。
如果再往深了问“XGBoost的分裂增益公式是怎么推导出来的”,你就得能写出来:
Gain = 1/2 * [ (G_L² / (H_L + λ)) + (G_R² / (H_R + λ)) - ((G_L + G_R)² / (H_L + H_R + λ)) ] - γ这个公式看着复杂,其实直觉很清晰:分裂后的增益等于左子树增益加右子树增益,减去分裂前整体的增益,再减去分裂带来的复杂度惩罚γ。如果Gain小于0,就不分裂。这个公式要能当场解释每个符号的含义,尤其要能说清楚λ和γ的作用。
3.3 优化算法:从梯度下降到模拟退火、粒子群
机器学习模型的训练离不开优化算法。这一块面试官常问的是梯度下降的变体,比如SGD、Momentum、RMSProp、Adam的区别。但如果你的岗位方向是供应链调度、路径优化或者运筹优化,那面试官会大概率追问一些更传统的优化算法:模拟退火、粒子群、遗传算法等。
我在热搜词里看到“粒子群算法原理”出现的频率很高,这里展开讲一下。粒子群算法(PSO)模拟的是鸟群觅食行为,每个解是搜索空间里的一个“粒子”,粒子有两个属性:位置和速度。每次迭代时,粒子根据两个“最优位置”来更新速度:
- 个体最优
pBest:当前粒子自己历史上最好的位置。 - 全局最优
gBest:整个种群历史上最好的位置。
速度更新公式是:
v = w * v + c1 * r1 * (pBest - x) + c2 * r2 * (gBest - x) x = x + v其中w是惯性权重,代表粒子保持原有速度的倾向;c1和c2是学习因子,分别控制“向自己学”和“向群体学”的强度;r1和r2是[0,1]的随机数。面试官如果考PSO,大概率会问:“w和c1、c2怎么调?”我一般会答:w大一点能增强全局搜索能力,w小一点能增强局部搜索能力,所以工业界常用线性递减的w,让算法前期多探索、后期多收敛。
模拟退火(SA)的原理则是借鉴金属退火过程:在高温时系统能接受较差的解,随着温度降低,接受差解的概率逐渐减小。SA最核心的概念是Metropolis准则:如果新解比当前解好,一定接受;如果新解更差,以概率exp(-ΔE / T)接受。这个“以一定概率接受坏解”的机制,是避免陷入局部最优的关键。
面试官喜欢把这两个算法对比着问:
| 维度 | 模拟退火(SA) | 粒子群(PSO) |
|---|---|---|
| 求解机制 | 单点搜索,靠概率接受差解跳出局部最优 | 群体搜索,靠粒子交互共享信息 |
| 参数敏感度 | 主要调初始温度、降温速率 | 主要调w、c1、c2、种群规模 |
| 适用场景 | 解空间较小、对解质量要求高 | 连续优化问题、工程参数寻优 |
| 并行性 | 天然串行,难以并行 | 群体之间可并行评估 |
如果你面的是京东物流或供应链相关岗位,建议把粒子群、模拟退火、遗传算法都准备一遍,并且想好“在什么业务场景下你会用启发式算法”。比如车辆路径规划VRP问题,精确解算法在规模大了之后根本算不动,这时候用遗传算法加局部搜索就能在可接受时间内给出一个不错的解。
4. 深度学习与大模型:2025年避不开的考点
4.1 Transformer八股:这几问几乎每场必考
2025年了,如果面试一个AI岗候选人,不问Transformer几乎是不可能的。但Transformer能问的问题太多了,我总结几个高频中的高频:
第一问:注意力机制为什么要除以根号dk?这个问题的标准答案是:当维度dk较大时,Q和K的点积数值会变得很大,导致softmax进入梯度极小的饱和区。除以根号dk是为了把点积的方差拉回到1左右,让softmax的梯度保持在一个合理的范围。如果面试官继续追问“为什么方差是dk”,你还要能解释:假设Q和K的每个元素都是均值为0、方差为1的独立随机变量,那么它们的点积的方差是dk,标准差是根号dk。
第二问:位置编码为什么用sinusoidal?为什么不用可学习的位置编码?这个问题的层次很丰富。最初Transformer论文用sinusoidal的原因之一是:它可以泛化到比训练时更长的序列长度,因为公式是固定的,不依赖训练样本。它可以被表示成相对位置的线性函数,这意味着模型能通过绝对位置编码间接学到相对位置关系。但后来的实践发现,可学习位置编码在大多数任务上效果也差不多,所以现在GPT系列用的是可学习的。RoPE和ALiBi是2025年面试更爱追问的后起之秀,RoPE的核心思想是通过旋转矩阵把相对位置信息编码到Q和K里,ALiBi则是直接在attention分数上加上一个与距离成正比的线性偏置。
第三问:LayerNorm和BatchNorm的区别?为什么Transformer用LayerNorm?简单来说,BatchNorm是在batch维度上做归一化,对batch大小敏感,而且在不同样本之间引入了依赖;LayerNorm是在每个样本的隐层维度上做归一化,与batch大小无关。Transformer用LayerNorm的核心原因之一是NLP任务里序列长度和batch大小经常变化,LayerNorm更稳定。还有一个原因是LayerNorm不依赖batch内其他样本的统计量,在推理时也不需要维护全局均值方差。
第四问:多头注意力为什么需要多头?多头的本质是让模型并行关注不同位置的不同表征子空间。单头注意力只能关注一种特征空间,多头相当于把特征空间切成多个子空间,每个头学习不同的注意力模式。面试官如果追问“所有头学到的模式一样怎么办”,你可以说实践中确实存在冗余,所以有些研究做“剪头”,减少不重要的头来加速推理。
4.2 大模型微调与RAG:实用场景下的面试追问
2025年的大模型面试,已经过了“只会喊Prompt Engineering就够”的阶段。面试官更多考察的是:你在真实业务场景里,怎么把大模型用起来,用得好,用得便宜。
LoRA为什么有效?这是微调部分最常问的问题。LoRA的核心洞察是:预训练模型在微调过程中,权重更新的本质是低秩的。既然权重矩阵W的增量ΔW是低秩的,那就没必要直接更新整个W,而可以把ΔW分解成两个小矩阵A和B的乘积(ΔW = BA,其中A的维度是r×k,B的维度是d×r,秩r远小于d和k)。训练时冻结W,只学习A和B。这样做的好处是显存占用大幅下降,不同任务可以共享同一个预训练底座,只需要存一个小而轻的LoRA权重。
面试官会追问:“LoRA的秩r应该设多大?”这个问题没有标准答案,一般经验是8到64之间。秩太小,表达能力不够;秩太大,又失去了低秩微调的意义。有些实践甚至发现r=8时在大多数任务上已经足够好,r大了反而容易过拟合。
RAG的完整链路是什么?这也是必考问题。一个完整的RAG系统包含离线索引构建和在线查询两个部分:
- 文档切分:将长文档按段落、语义边界切成chunk,chunk太大会导致检索不精准,太小会丢失上下文。
- 向量化:用embedding模型把chunk转成向量。
- 向量存储:存入向量数据库,构建近似最近邻索引(如HNSW、IVF)。
- 查询召回:用户query向量化后,用ANN算法召回Top-K个相关chunk。
- 重排序:用cross-encoder或者LLM做rerank,把相关性最高的chunk排到最前面。
- 生成:把query和召回的chunk拼进prompt,交给LLM生成答案。
面试官如果深挖RAG,最容易问的是:“召回Top-K怎么选?K大了会有什么问题?”K太大会引入噪声,导致LLM生成的答案被无关信息干扰;K太小又可能漏掉关键信息。实际操作中K一般取5到10,但也要看chunk大小、任务复杂度做实验。
4.3 AI Agent:工程落地能力的新考区
如果说2024年是RAG年,那2025年绝对是AI Agent年。京东内部很多业务场景都在探索Agent化改造,比如智能客服Agent、供应链决策Agent、数据分析Agent。所以面试官出题也越来越喜欢往Agent方向靠。
面试官问Agent相关的问题,一般不会只让你解释概念,而是给一个具体场景让你设计。比如:“如果让你用Agent做新品上架前的市场分析,你怎么设计?”你回答的时候要覆盖这几个关键部分:
- 任务分解:市场分析可以拆成用户需求分析、竞品分析、价格策略分析、评论情感分析多个子任务。
- 工具调用:每个子任务需要哪些外部工具,比如DB查询工具、搜索工具、NLP分析工具。
- 规划机制:如果Agent的能力不足时要怎么应对。
- 记忆设计:短期记忆保存当前会话的关键上下文,长期记忆保存历史决策偏好。
- 纠错机制:如果获取到的数据质量差或者工具调用失败,Agent怎么自动重试或者切换方法。
我建议大家准备Agent面试题时,多研究一下ReAct模式,也就是推理和行动交替进行的范式。ReAct的思路是让模型交替输出“Thought(思考)”“Action(行动)”和“Observation(观察)”。这样Agent的每一步决策都有迹可循,方便调试和兜底,这是工程落地时很看重的点。
5. 手撕代码与工程能力:别让细节拖后腿
5.1 手撕代码的高频题型与时间分配
算法岗面试几乎都逃不掉手撕代码环节,京东也不例外。根据我这两年的面试体验,手撕代码的题目难度中等偏上,很少有那种“看一眼就懵”的超级难题,但很考验边界处理和工程习惯。
我整理了2025年面试中出现频率最高的几类题:
- TopK问题:海量数据求最大的K个,用小根堆;求第K大,用快排的partition。面试官常追问“数据量放不进内存怎么办”,这就是分治+堆的经典场景。
- LRU缓存:要求手写,核心是HashMap + 双向链表。这个题考察的是你对数据结构的组合运用,以及get和put操作O(1)时间复杂度的理解。
- 二叉树遍历:前中后序、层序遍历,既要会递归也要会迭代。面试官经常追问“morris遍历了解吗?”,这个遍历能把空间复杂度优化到O(1)。
- 字符串相关:最长回文子串(动规或中心扩展)、判断括号是否有效、字符串转整数。
- 链表操作:反转链表、环形链表判断、合并K个有序链表。
手撕代码的时间分配建议:简单题控制在10分钟以内,中等题控制在20到25分钟,如果超过30分钟还没有完整思路,大概率是状态不对或者准备不足,这时候别硬凹,先沟通思路,让面试官帮你指一条路。
我特别想提醒一点:代码写完之后一定要自己过一遍测试用例。很多候选人写完就停笔,等着面试官问“写完了吗”。实际上,最好的做法是主动拿一个简单例子,比如二叉树题构造一个三层小树,手动跑一遍你的代码,确认每步结果合理。这一步能暴露大量边界错误,也能让面试官觉得你工程能力强。
注意:手撕代码时,先在注释里写清楚思路,再动笔写代码。这不是浪费时间,而是让面试官能跟着你的思路走,即便最后代码没完全跑通,思路正确也能拿不少分。
5.2 从检索到重排:推荐/搜索方向的一段典型追问模拟
京东大量的算法岗位集中在搜索、推荐、广告方向。这类岗位的面试里,除了算法题和基础题,还会有一道“场景题”,模拟一个完整的业务链路。我举一个我在面试中很喜欢问的例子,各位可以感受一下考察深度。
假设面试官问:“系统里用户搜索一个query,你负责从召回、粗排、精排到重排的完整链路。如果精排之后的点击率预估不准,你从哪些角度排查?”
这个问题没有唯一答案,但好的候选人会按顺序给出系统性的思路:
- 数据侧:训练样本和线上特征是否一致?是不是存在特征穿越?正样本的采样比例对不对?
- 特征侧:特征的重要性分布如何?新特征有没有做上线对比实验?
- 模型侧:用离线AUC、GAUC评估是否和线上指标一致?有没有过度拟合老数据?
- 服务侧:线上推理的特征服务是否超时、是否用了默认值兜底?
再往下,面试官还会追问:“召回阶段,你怎么保证召回的效率和相关性?”这时候你至少应该说出:数据规模大用向量召回,规模小用倒排索引;两路召回策略(比如关键词召回+向量召回)如何融合;召回Top-K怎么和精排衔接。
这一整串问题,考察的不是某一个单独的知识点,而是你对推荐系统整个链路的理解程度。我强烈建议准备搜索/推荐方向的同学,把“召回-粗排-精排-重排”四个阶段的核心算法、典型模型、工程实践都画一遍,做到能用一张图和一个故事把整条链路串起来。
6. 我的面试复盘与避坑清单
6.1 面试中常见的翻车现场与应对策略
面试这半年,我见过太多候选人在同一个坑里翻车。我把这些坑总结出来,希望通过这篇文章能帮大家避掉:
翻车一:只背答案,不理解推导。比如问到“为什么快排是不稳定的”,有人答“因为partition交换的时候会改变相同元素的相对顺序”,这没错,但面试官如果追问“那怎么改成稳定排序”,很多人就懵了。实际上,想让快排稳定,可以用“两趟扫描”的方式,先把小于pivot的按顺序放左边,再放等于的,再放大于的,但这样空间复杂度就上去了。面试官考这个,更多是想看你能不能举一反三。
翻车二:算法题不确认输入输出就动手。有些候选人看到“给一个数组”就直接开写,没问数组里的数是不是正整数、长度范围是多少、能否修改原数组。这些信息直接决定了用哪种算法。我建议拿到题目先花一分钟把边界条件问清楚,这不是浪费时间,而是专业的表现。
翻车三:项目经验讲不清“为什么要这么做”。面试官问项目,很少只关心“你做了什么”,更关心“你为什么选这个方案”“当时还有哪些可选项”“你的方案上线后指标涨了多少,为什么涨”。很多人把项目背景讲得绘声绘色,一到决策依据就含糊其辞,这非常减分。
翻车四:聊大模型只会背名词。2025年的大模型面试跟以前不一样了,光抛出“RAG”“LoRA”“Agent”这些术语不能满足面试官。你得能结合实际案例讲清楚“你的业务里怎么用”“遇到什么问题”“怎么评估效果”。面试官不怕你不会,就怕你只会名词解释。
6.2 动手之前,先做好这几件事
这里结合我自己带人面试和辅导候选人的经验,给出一份我觉得比较可靠的备考思路,按优先级排:
第一,把数据结构与算法基础过扎实。LeetCode中等难度题至少刷150道以上,高频题型(数组、链表、树、DP、贪心、二分、堆)做到随手就能写。这不只是为了应付手撕代码,更是为了在聊算法题时能自然地展示复杂度分析的功力。
第二,机器学习基础要能手推公式。逻辑回归、SVM、朴素贝叶斯、决策树、GBDT,这五个算法的损失函数、梯度推导、正则化方式至少能手写一遍。不需要像数学专业那样严丝合缝,但每个关键步骤要知道为什么。
第三,选择一个深度的方向,做到能讲透。京东的搜索、推荐、广告、供应链、大模型、CV、NLP每个方向都能展开很多内容。你不需要全部精通,但至少要有一个方向能连续深入聊30分钟,从算法原理聊到工程落地的细节。
第四,项目复盘写到“口头表述版”。不要满足于简历上那几行字,把你做过的项目的背景、方案选型、难点、效果、可复用性写成一页纸的解说词,反复讲给自己的朋友或录音听。流畅度和逻辑性是这个环节最容易被忽视的。
我个人在实际操作中的体会是:面试不仅仅是“被考察”,更是一场“你有选择权的双向沟通”。好的候选人不止是答对题,更是在每个回答里展现自己的思考方式。你回答“这个方案有缺点,我在什么条件下会选择它”,比单纯说“这个方案很好”要可信得多。最后再分享一个小技巧:每次面试结束,把回答不好的题目趁热记录下来,不用整理成漂亮的格式,就写“这个问题我卡住了,原因是什么,正确答案的切入点是什么”。积累十次之后,你会发现自己对考点的敏感度提升得非常快。