拿这套B卷的时候,我第一反应是:怎么一股“业务味”这么浓?选择题里大量选项都往电商场景上靠,算法题也不是那种纯LeetCode模板题,反而像在替你提前模拟入职之后的日常。很多人复习校招笔试有个误区,觉得机器学习方向就是把西瓜书背熟、把LeetCode刷完就稳了。但你要是见过唯品会这类电商公司的题就会发现,他们真正想筛的不是“你会不会调包、背结论”,而是你对模型原理的理解深度、对业务约束的敏感度,以及在一个半小时里拆解问题的能力。
这篇文章不是押题,而是借这份流传出来的B卷,把背后的考点和复习逻辑彻底讲透。我会按“卷面整体风格、机器学习基础题考点、算法与数据结构真题复盘、电商业务场景题、开放性设计题、复习节奏”六块展开。无论你是马上要参加校招,还是正在准备明年春招,按这套思路去准备,至少不会在笔试场上被问到怀疑人生。
1. 拿到B卷先看整体:这套题在考“能上手”而不是“背过了”
1.1 从卷面结构看唯品会想要什么样的候选人
从笔试圈的反馈和我整理过的历年面经来看,这套B卷的题型分布基本可以用三块概括:机器学习/统计基础约占一半,算法与数据结构推导和手写约占三成,剩下两成是业务场景与开放性设计题。
前一半的机器学习题,看起来都是“熟面孔”:偏差方差、正则化、模型评估、聚类、朴素贝叶斯、逻辑回归、SVM、特征选择这一类。但妙就妙在,很多题不是直接问“L1和L2的区别是什么”,而是包装成“训练集AUC很高但线上点击率反而下降,以下哪个原因最可能”这种形式。换句话说,考点还是那个考点,但出题人假设你已经知道结论,想看你能否在真实业务里识别出对应的问题。
后一半的算法题,据经历过笔试的同学反馈,KMP、排序、最短路、动态规划、贪心都有可能出现,而且往往要求手推复杂度或者手写核心代码。这部分和纯互联网大厂的风格差异不大,关键是速度和准确率。
至于开放题,比如“如何设计流失预警系统”或者“怎么预测大促期间的销量”,这类题目没有标准答案,但也最容易拉开差距。后面我会专门讲这部分的答题框架。
1.2 为什么说这套题“看似基础,实则挖坑”
这套B卷最大的迷惑性在于:你猛一看,觉得每题都见过,再仔细一想,发现每个选项都像是“半对半错”。
举个例子,考过拟合的题里,干扰项经常会写“随机森林对噪声完全不敏感,所以不会过拟合”,或者“增加训练数据一定可以缓解过拟合”。懂行的人一看就知道,随机森林只是通过多棵树平均来降低方差,噪声大时照样过拟合;增加训练数据也“不一定”有效,如果你的模型复杂度不够,数据再多也白搭。笔试里很多人就是栽在这种“看着眼熟、没深想”的选项上。
还有一类坑是概念混淆。比如“偏差”和“方差”这对概念,很多人背了“高偏差=欠拟合、高方差=过拟合”,但题目换个问法,比如“训练误差很低但验证误差很高,说明什么”就开始犹豫。所以在复习时,不仅要知道结论,还要能把结论倒推回具体的训练现象。
另外,算法题里KMP这类字符串题特别考验细节。不同教材对next数组的定义不完全一样,有的叫“最长相等前后缀长度”,有的直接定义为“失配时跳转位置”。如果你平时只看一种写法,考试时遇到另一种定义,可能整套题从头错到尾。这种“定义坑”我在后面会专门拆开讲。
2. 机器学习基础题:不要只背结论,面试官喜欢问推导
2.1 偏差-方差这类题怎么拿满
偏差方差分解几乎是校招必考,公式本身不复杂:
泛化误差 = 偏差² + 方差 + 噪声
直觉上可以这样理解:偏差是高矮问题——你瞄得准不准,平均落点偏不偏;方差是散布问题——你每次射出去的弹着点分散程度。一个模型如果偏差大,说明它欠拟合,连训练集都没学好;如果方差大,说明它过拟合,训练集学得太好,换一组数据就崩。
笔试里常考的是让你判断“某一现象属于高偏差还是高方差”,这有几个实用判断规则:
- 训练误差高、验证误差也高:高偏差,典型的欠拟合。对策是增加模型复杂度、加特征、减少正则化。
- 训练误差低、验证误差高:高方差,典型的过拟合。对策是加正则化、增加训练数据、降低模型复杂度、做特征筛选。
- 训练误差和验证误差都低但两者差距大:说明模型方差偏大,但整体尚可,重点观察泛化能力。
注意一点,笔试里经常把“增加训练数据”当成万能答案。这本身没错,但它只能缓解高方差,对高偏差几乎无效。答题时一定要先判断偏差还是方差,再对症下药。
2.2 正则化“为什么L1稀疏、L2平滑”的几何直觉
L1和L2正则化的区别,是另一道高频题。很多人背结论:L1产生稀疏解、可以做特征选择,L2把系数压得比较小但不会变成0。但笔试如果追问“为什么”,光背结论就不够了。
从几何上理解最直观。不加正则时,最优解是损失函数等值线和参数空间的某个交点。加了L1之后,约束区域是一个菱形(二维情况),它的顶点在坐标轴上。损失函数等值线在向外扩张过程中,很容易先碰到菱形的顶点,这个顶点的某个坐标为0,于是对应特征就被“干掉”了。L2的约束区域是圆形,边界处处光滑,解不太会落在坐标轴上,所以它只是把系数整体往小压,但很难压到正好为0。
还有一个常考角度是“L2为什么能防过拟合”。系数变小意味着每个特征的贡献被稀释,模型输出对单个特征的变化不那么敏感,相当于变相降低了模型的复杂度。笔试里如果让你口头回答,可以这样组织:L1正则化通过稀疏化实现特征选择,L2正则化通过限制系数范数来降低模型复杂度,两者都能缓解过拟合,但机制和副作用不同。
2.3 类别不平衡与评估指标:选错指标就白建模
电商场景里的机器学习题,十有八九绕不开类别不平衡。唯品会这种平台,用户点击率、购买转化率、流失比例,正样本比例经常低到1%以下。这时候用准确率评估,就是典型的“垃圾指标”——你只要把所有用户都预测成“不购买”,准确率也能到99%,但模型毫无价值。
笔试里会问“这种场景应该看什么指标”,标准答案是AUC和PR曲线,但很多人忽略了这两者的适用差异:
- 正负样本比例极度失衡且你更关心正样本找得全不全时,PR曲线比AUC更敏感。
- AUC更关心排序能力,对整体正负样本顺序敏感,适合CTR预估这类排序场景。
- 在风控、流失预警这类“正样本极少但每找对一个都值钱”的业务里,PR曲线的提升更能反映模型实际价值。
再往下挖,常用的处理手段也要能说出来:过采样SMOTE、欠采样、调整类别权重、用AUC/PR/召回率等指标代替准确率、做代价敏感学习。如果笔试里出现“正样本0.1%,现在用LR做分类,你怎么评估”这种题,先讲指标选择,再讲数据处理,基本上就能拿住大部分分数。
2.4 聚类、K-Means初始化和模型融合高频考点
聚类算法里最常考的是K-Means的两个痛点:K值怎么选、初始中心怎么定。K值盲目用肘部法则有时候不靠谱,因为“肘部”不明显时很难判断;更稳妥的做法是结合轮廓系数、业务可解释性和下游任务需求。初始中心如果随机选,很容易陷入局部最优,K-Means++通过“距离越远的点越容易被选为新中心”来缓解这个问题。
模型融合也是笔试热点,重点区分Bagging和Boosting:
- Bagging(如随机森林)并行训练多个独立模型,平均后降低方差,适合高方差模型。
- Boosting(如GBDT、XGBoost)串行训练,每个新模型重点拟合前面模型的残差,降低偏差,适合高偏差模型。
还有个容易被忽略的补充考点:粒子群算法(PSO)。它不依赖梯度,适合特征选择、超参搜索这类离散或非光滑问题,迭代公式也很简单:每个粒子根据个体最优和全局最优更新速度,再更新位置。笔试可能不会让你完整推导,但要能说出“它和梯度下降的本质区别是什么”“什么时候用元启发式而不是梯度下降”这类问题。
3. 算法与数据结构真题复盘:手算、手写、别翻书
3.1 KMP的next数组:最容易栽的“定义坑”
字符串匹配是笔试常客,KMP更是因为“理解难度适中但极易出细节错”而备受出题人喜欢。网上流传的B卷回忆里,有人就提到过让求模式串 p="abacaba" 的next数组。这个题看着简单,实际能错出一片。
我先把求next数组的两种常见定义都算一遍,你对照着看自己平时用的是哪一种。
模式串 p = a b a c a b a,下标按0开始记。
定义一:next[i] 表示 p[0...i] 这个子串中,最长相等前后缀的长度。
- i=0,子串"a",没有真前后缀,长度0
- i=1,"ab",前缀{a},后缀{b},不相等,0
- i=2,"aba",前缀{a, ab},后缀{a, ba},最长相等前缀后缀是"a",长度为1
- i=3,"abac",前缀{a, ab, aba},后缀{c, ac, bac},没有相等,0
- i=4,"abaca",最长相等前后缀是"a",长度为1
- i=5,"abacab",最长相等前后缀是"ab",长度为2
- i=6,"abacaba",最长相等前后缀是"aba",长度为3
所以按这个定义,next = [0, 0, 1, 0, 1, 2, 3]。
定义二:next[i] 表示“第 i 个字符匹配失败时,模式串应该跳到哪个下标”,也就是把上面的数组右移一位,并在开头补-1:[-1, 0, 0, 1, 0, 1, 2]。
笔试里最坑的就是这个。题目如果说“next[i]定义为前i个字符组成的子串中最长相等前后缀长度”,那答案就是第一种;如果说“失配时跳转位置”,那答案就是第二种。你平时如果不注意区分,遇到定义二的卷子,第一问就算错,后面全跟着错。
注意:有些教材在字符串下标从1开始时,失配跳转数组会写成 [0, 1, 1, 2, 1, 2, 3],本质是定义二在1-based下标下的变形。考试时先看清下标起点和next的定义,再动手算。
3.2 快速幂与“O(log n)到底怎么来的”
快速幂是笔试里性价比极高的题,代码短、思路清晰,但很多人写不对。
核心思路是把指数b拆成二进制。比如求 a^13,因为 13 = 1101(二进制) = 8+4+1,所以 a^13 = a^8 × a^4 × a^1。我们只需要对b的二进制从低位到高位检查,如果当前位是1就乘上对应的a的幂次,同时每一步让 a 自己平方。
参考代码(Python):
def fast_pow(a, b, mod): res = 1 base = a % mod while b > 0: if b & 1: res = (res * base) % mod base = (base * base) % mod b >>= 1 return res为什么复杂度是O(log b)?因为每轮循环b右移一位,也就是二进制长度缩短1位,而b的二进制位数为log₂b。无论b是多少,循环次数可控,完全不是O(b)的暴力乘法。
笔试里的变体包括“求矩阵快速幂”和“大数取模”。矩阵快速幂就是把“数乘”换成“矩阵乘”,代码结构一模一样,但复杂度分析要从“指数位数”的角度重新理解一遍。
3.3 堆排序的建堆复杂度和“不稳定”考点
堆排序是排序算法里的重点,笔试常考两个点:建堆为什么是O(n)而不是O(n log n),以及堆排序为什么不稳定。
先解释建堆复杂度。从最后一个非叶子节点开始,自底向上做下沉操作。大多数节点在接近堆底的位置,它们下沉时最多走一两层就到叶子了;只有少数靠近根节点的节点才可能走到全树高度。把所有节点的下沉次数加起来,经过求和可以收敛到O(n)。直觉上可以这样记:越靠下的节点数量越多,但下沉深度越小;越靠上的节点下沉深度越大,但数量极少,两者一抵消就是O(n)。
堆排序不稳定则是因为堆调整过程中元素会大跨度交换,相同值的元素相对顺序没有保证。笔试如果问“稳定的排序有哪些、不稳定的有哪些”,要能脱口而出:快排、堆排、选择排序、希尔排序都不稳定;归并、插入、冒泡、基数排序稳定。
另外,堆排序空间复杂度为O(1),这是它和归并排序O(n)空间最明显的区别,也是考题常出的对比点。
3.4 Dijkstra、DP与贪心的边界:图论题为什么那么爱考“为什么对/为什么错”
Dijkstra是校招图论题最高频的算法之一。单纯让你背模板意义不大,考官更喜欢问“为什么Dijkstra不能处理负权边”。
答案要从贪心策略说起。Dijkstra每次从当前距离最小的点出发,并认为这个点的最短距离已经确定,不会再被更新。这个假设在边权全为正时成立,因为通过其他点绕回来看,路径距离只会更大。但如果存在负权边,就可能出现“先绕到一个当前距离较大的点,再通过一条负权边回到当前点,反而更短”的情况。此时一旦某个点的最短距离被“确定”了,后面就无法再修正,最终结果就是错的。
同理,动态规划考的是状态设计和转移方程,贪心考的是“怎么证明贪心选择不会错”。笔试遇到贪心题,只写“按结束时间排序然后选”是不够的,还要能说清“为什么这个局部最优能推出全局最优”,常用的是反证法或交换论证法。
如果时间允许,还可以了解一下二分图匹配的HK算法和规则引擎里的Rete算法。这两类算法不是大厂必考,但属于“考到就拉开差距”的知识点,因为它们考察的不是背模板,而是对算法匹配过程的真正理解。
4. 电商场景里的机器学习题:唯品会的“业务味”从哪来
4.1 搜索排序与个性化推荐:特征和样本怎么构造
电商场景题里,搜索排序和推荐是两大支柱。这类题不像基础概念题有标准答案,但评卷人心里有一套“合理思路”的尺子。
记得基本链路:召回、粗排、精排、重排。召回阶段要解决“从几百万商品里找出几百个候选”,常见手段是i2i(商品与商品的相似度)、u2i(用户历史行为关联)、热门兜底。精排阶段才轮到模型上场,用LR、GBDT、DNN或者现在的排序学习模型。
特征工程是重点。用户侧的年龄、性别、历史点击类目分布;商品侧的价格、品牌、折扣力度、库存;上下文侧的时间、设备、页面位置。这些特征要花篇幅讲清楚来源和含义,尤其是“时间衰减”这个点——用户三个月前买过什么和昨天看过什么,权重完全不一样。
样本构造也容易被忽略。搜索排序的样本通常是“曝光→点击→转化”漏斗,取曝光日志做负样本,点击日志做正样本,再用转化行为加权重。如果笔试题问你“为什么不能只用点击日志训练”,你要能答出:没有曝光样本,模型学不到“哪些商品用户看到了但没点”,上线后会严重偏向把所有商品都推给用户。
冷启动是另一个加分回答点。新用户没有历史行为,冷启动的办法包括:推荐热门商品、用注册信息做粗粒度偏好、配合Bandit算法让探索和利用平衡。新商品则可以用同品牌、同类目的热门商品做桥接,先把流量导进来,等积累一定曝光再进入个性化模型。
4.2 销量预测与大促活动:时间序列和回归的边界
唯品会做特卖,销量预测的题目一定会带上“闪购”“限时折扣”“有限库存”这些业务背景。这类题的本质是让你在有限的上下文里做出靠谱的预测方案。
预测大促销量,模型选型有两条路:一是时间序列模型,比如ARIMA、Prophet,适合有长期趋势和周期性规律的数据;二是把问题转成回归问题,用GBDT、XGBoost甚至深度的时序模型,把日期、星期、节假日、折扣力度、流量预估、去年同期的销量作为特征。
实际笔试中,更推荐第二类思路,因为它的解释性和可操作性更强。你可以直接说:先按商品维度构造训练集,特征包括历史销量均值、最近7天销量波动、价格折扣比例、是否参与大促、库存深度、预热期的加购人数,然后训练GBDT回归模型预测未来N天的销量。如果面试官追问“为什么用GBDT而不用LSTM”,答案是:表格型特征在GBDT上效果通常更好,训练快、可解释性强,LSTM的优势在长序列依赖上,但日常销量数据未必有那么长的序列依赖。
还有一个容易漏讲的点:预测结果要反推业务动作。比如库存准备、物流排班、推荐流量配比,这些下游动作才是销量预测的真正价值。能把模型输出和业务决策串起来,已经是你在开放题里的明显加分项。
4.3 风控与用户流失:当正样本只有0.1%时怎么办
风控题和流失预警题本质是同一个问题:在极度不平衡的数据上做二分类。这类题目的答题思路和2.3节提到的内容直接打通。
先说流失预警。首先,流失的定义要明确,是“30天未登录”还是“180天未购买”,不同定义会直接影响正样本比例,也会影响业务上干预的可行性。特征上,可以用RFM(最近消费时间、消费频率、消费金额)做基础特征,再叠加访问频次、优惠券使用情况、客服咨询记录、浏览时长变化等行为特征。模型上,LR、随机森林、GBDT都可以,关键是评估指标要选对,不能只看准确率。
风控领域,常见问题包括“薅羊毛”“批量注册”“异常下单”,正样本同样极少。除了二分类的思路,还可以考虑异常检测和孤立森林,从“正常用户是大多数”的角度出发找离群点。电商风控还有一个特色解法:基于关系网络的图算法,把用户、设备、IP、收货地址连成图,批量注册的小号会在图上形成高度聚集的团伙结构,这种图特征往往是模型效果提升的关键。
4.4 A/B测试和因果推断:笔试里最容易说漏的步骤
A/B测试在电商公司笔试中出现的频率极高,因为它考察的不只是机器学习知识,还有工程和业务思维。最基础的问法是“怎么做一次A/B测试”,标准步骤是:确定实验指标、设计分流方案、计算样本量、跑实验、做显著性检验、得出实验结论。
很多人在“分流”这一步只说“随机分50%和50%”,这不够。
分流要做到三点:一是随机性,最好用用户ID的哈希做分流,而不是简单按时间前后切分;二是均衡性,实验组和对照组在用户属性、活跃度、历史购买力上要基本一致;三是独立性,不同实验之间要避免相互干扰,同类实验不能叠加在同一批用户上,否则分析不出是哪个实验带来的效果。
显著性检验也要能说清楚:p值小于0.05说明差异在统计意义上显著,但“统计显著”不等于“业务显著”。实验组点击率提升0.1%,统计上可能显著,但业务上如果流量大、成本高,这个提升可能不值得上线。这类“显著性陷阱”是面试官很喜欢追问的点,平时复习要有意识地积累。
5. 开放性设计题:没有标准答案,但有高下之分
5.1 拿到一道设计题先做“边界谈判”
开放设计题最怕的是拿到题就开始堆模型。比如题目说“设计一个流失预警系统”,有人上来就说“用XGBoost跑一下”,这种回答基本没有亮点。
更好的做法是先做“边界谈判”,也就是把问题问清楚。举个例子,你可以说:我先确认几个问题——流失的定义是什么?正样本比例大概多少?目前有哪些数据源,比如登录日志、订单表、客服记录?预测出来之后,业务方打算做什么干预动作?这些信息会直接影响特征和模型的选择。
这笔“问需求”的功夫,在笔试里很难真正提问,但你在答题时可以把假设条件写出来,比如“假设流失定义为30天未登录,数据源包括登录日志、订单表和优惠券使用记录,那么我会……”。这样既展示了定义边界的能力,也让你的方案看起来更严谨。
5.2 一个“从0到1做流失预警”的完整答题框架
下面给一个可以直接当答题模板的框架,遇到类似的业务设计题都可以往上套:
- 问题定义:流失口径是什么?预测周期是多长?是预测“未来7天会流失”还是“未来30天会流失”?
- 数据与标签:正样本为“周期内没有发生任何购买/登录行为”的用户;负样本为周期内仍有行为的用户。注意做样本时间窗和特征时间窗的切分,防止特征泄漏。
- 特征工程:用户基础属性(注册时长、城市、年龄段)、消费行为(RFM、客单价变化、品类偏好)、访问行为(登录频次、浏览深度、活跃时段)、营销触达(优惠券是否使用、Push点击率)。
- 模型选择:GBDT跑基线,配合逻辑回归做可解释性分析。如果样本量足够大,可以上DeepFM等深度模型,但需要说明可解释性会下降。
- 评估与监控:用AUC和召回率做离线评估,重点看“未来会流失的用户里,模型能提前捞回来多少比例”。上线后监控AUC、PSI(模型稳定性)和业务干预的ROI。
- 干预闭环:有了预测名单之后做什么?发优惠券、做专属客服回访还是调整推荐策略?模型预测只是第一步,能把“预测—干预—回收效果”闭环讲清楚,你就在绝大多数候选人之上。
我当年实习的时候,导师教过我一句话:模型上线不是终点,监控才是。后来自己在笔试里写这类设计题,把这句经验转化成“上线后要关注模型效果随时间衰减的问题,定期重新训练”的表述,面试官反应都很好。
5.3 开放性题的三个常被忽略的加分点
第一,指标要跟业务挂钩。不要只说“AUC达到0.85”,要说“0.85的AUC对应多少召回率,能够覆盖多少流失用户,这些用户挽回的GMV有多少”。这个思维是校招生和社招老手最大的差距。
第二,模型可解释性要主动提。电商业务里,运营团队会问你“为什么给这个用户发券”,如果模型解释不了,业务很难信任。所以方案里可以加上“用SHAP值分析关键特征,输出每人维度的召回理由”。
第三,要主动说风险。比如“样本不平衡可能导致模型偏向预测多数类”“训练数据可能存在选择偏差,只有收到过优惠券的用户的转化数据,没有收到过优惠券的用户缺乏反事实数据”。能主动暴露问题并提出缓解方案,展示的不只是技术能力,还有对数据和业务的成熟理解。
6. 从这套真题倒推校招准备节奏
6.1 我建议的时间分配
准备校招笔试,最怕的是平均用力。基础原理还没捂热就去刷困难题,回头基础题照样错;或者只顾刷题不碰业务,遇到开放题直接卡壳。我的建议是三段式:
第一段,用2到3周把机器学习基础打牢。重点是西瓜书前七章里的每一条公式都能自己推导一遍,比如逻辑回归的损失函数和梯度、SVM的对偶形式、朴素贝叶斯的条件概率计算。不要只看不推,笔试里“写出梯度表达式”这类题,你只看书是写不出来的。
第二段,用1到2周集中刷算法题。不用贪多,LeetCode hot 100加剑指offer的高频题就够。重点题型是:字符串匹配(KMP)、排序(快排、堆排)、二分、动态规划(背包、子序列)、图(最短路、拓扑排序)、贪心。每道题刷完,要在脑子里重新走一遍复杂度分析,这样才能应付“为什么这个解法是O(n log n)”的追问。
第三段,考前一到两周做“公司定向”准备。想去电商公司,就重点准备推荐、搜索、销量预测、流失预警这些场景题;想去纯互联网平台,多积累用户增长、内容分发场景的题。这段时间还可以把自己对推荐系统、A/B测试的理解写成文档,确保开放题现场不会语无伦次。
6.2 做题策略和心态
笔试时间通常是一个半小时左右,题量不小。我的策略是:先快速扫一遍整张卷子,把有把握的选择题和填空题先做了,它们是基本盘,不能丢;接着做推导题和算法题,遇到卡壳超过5分钟的,先跳过,最后再回来;开放设计题留足15到20分钟,因为它的分值通常最高,而且答案组织得好不好,一眼就能被看出来。
写算法题时,如果实在写不出完整代码,不要空着。写“思路+伪代码+关键复杂度”也能拿到大部分分数,尤其是公司笔试人工判卷的时候,思路和沟通能力比一个无bug的最终代码更重要。
6.3 笔试到底在筛什么人
我带实习生的过程中回头再看这套笔试逻辑,感受特别深:校招笔试筛的从来不是“已经什么都会”的人,而是“在有限信息里能稳定输出合理方案”的人。机器学习基础题考的是你有没有底子,算法题考的是你的逻辑基本功,业务题和开放题考的是你有没有“把模型用在真实数据上”的意识。
我自己当年复习时,最吃亏的一件事就是一上来就去背各类模型的优缺点,结果被一道“训练误差很低但线上效果差”的问题问住,才发现自己对偏差方差的理解只停留在字面,没有真正理解它在业务里的表现。后来把每个概念都问了一遍“这个结论在什么条件下成立、什么条件下不成立”,再去笔试,明显稳了很多。
如果你现在还在准备期,记住一个学习原则:不要只看“是什么”,要追问“为什么”和“什么时候不成立”。把每个机器学习概念都当成一道业务题来理解,比埋头刷一百道题更管用。祝你笔试顺利,拿到理想的offer。