公司动态

十年复盘:阿里算法实习生笔试高频考点与解题思路

📅 2026/8/29 4:41:03
十年复盘:阿里算法实习生笔试高频考点与解题思路
前些天整理旧资料翻到一个存了快十年的文档标题写着“阿里巴巴2015算法工程师实习生笔试卷”。点开看了几眼一下子被拉回当年那个刷题、忐忑、又充满期待的季节。这份卷子虽然过去很久了但里面考的很多逻辑放到今天的算法岗面试里依然不过时。陆陆续续也有学弟学妹问起当年笔试考什么、怎么准备干脆把这份笔试卷拆开揉碎结合我后来的复盘和实际工作体会写成一篇完整的复盘文章。无论你是正在准备大厂算法实习笔试的学生、刚转行做算法的新人还是想回顾一下行业考察点变化的老手这篇文章都能给你一些参考。需要先说明我不是按照某张遗失的原始卷逐字复现而是基于当年这类笔试的题型、考点和出题逻辑把最有代表性、最值得反复琢磨的题目和思路整理了出来。重点不是题目本身而是题目背后想考察的能力以及后来我在真实业务里验证过的东西。1. 先别急着做题2015年阿里算法实习生笔试到底在筛什么2015年的时候“算法工程师”在大厂已经是明确独立的岗位了但还没有像今天这样细分成推荐、搜索、NLP、CV、运筹等方向。当时阿里算法工程师的核心场景基本围绕电商和大数据展开商品推荐、搜索排序、广告点击率预估、用户画像、风控反作弊。这些场景都对算法实习生的数学功底、编码能力、数据敏感度提出了很高的要求。那年笔试的时间大概是两小时左右我印象里卷面结构大致是12到15道不定项选择题、两道在线编程题、一到两道应用题。选择题覆盖数据结构、概率统计、机器学习基础编程题需要在网页编辑器里直接完成应用题则给你一个偏业务的场景让你写分析思路和方案框架。这个结构其实藏着一个非常清晰的人才筛选漏斗。1.1 为什么卷面要这样设计选择题筛基础编程题筛落地应用题筛思维选择题是第一个门槛。考的是“是否具备扎实的理论储备”比如哈希表冲突怎么处理、贝叶斯公式怎么展开、LR的损失函数是什么。这类题在短时间里就能判断一个人有没有认真啃过专业基础课。很多同学复习时只盯着机器学习模型却忽略了数据结构与算法结果在选择题上先栽了跟头。编程题是第二个门槛。算法工程师不是纯研究岗再好的模型也要落地成工程代码。笔试环境里没有IDE提示、没有自动补全考察的是你能否在限定时间内把思路写成一段可运行、边界条件考虑完整的代码。2015年那会儿我考场里就见到同学在编程题上卡到时间结束说明平时刷题量不够。应用题是最后一个也是当时区分度最大的一关。它给你一个业务问题让你设计算法方案。没有标准答案考察的是分析路径是否清晰、方案是否可落地、有没有考虑评估指标和异常情况。这关最能反映一个人是把算法当“玩具”还是在用它解决实际问题。1.2 面试官视角笔试不是考满分是找“能做业务场景题”的人我在后来参与过一些面试流程后才真正理解阅卷人的心态。笔试从来不是靠满分过线而是看你在哪些题上有亮点。一份卷子拿到手面试官会优先看编程题和应用题代码结构清不清楚、有没有写注释、边界有没有处理应用题里有没有体现召回、排序、评估、冷启动这些工程化思路。所以当年能通过笔试的人普遍具备三个特征基础课学得扎实代码量足够对电商或互联网产品场景有基本感知。相反光记了一堆模型名字却写不出推导、或者能手推公式却写不出一道链表反转的都很容易被刷。这个筛选逻辑直到今天也没变。2. 高频考点复盘决定你能否进下一轮的“分水岭知识点”那年的笔试卷里有几类考点出现的频率极高几乎年年都有、换汤不换药。它们分别是数据结构和基础算法题、机器学习核心理论题、概率统计应用题。下面挑三道最有代表性的题目详细展开每道题我都附上当年的答题思路以及后来在工作中验证过的理解。2.1 编程题最大子数组和的三种解法这个题大概是这么描述的给定一个整数数组求一个连续子数组使得子数组元素之和最大返回这个最大值。数组可能包含负数。我当年看到这个题的第一反应是暴力双循环枚举起点和终点求区间和更新最大值。时间复杂度O(n²)数据量大一点就超时。后来刷题多了才知道这题有一个教科书级别的解法叫Kadane算法思路非常朴素遍历数组时维护两个变量——current表示“以当前位置结尾的子数组最大和”global表示“到目前为止的全局最大和”。def max_subarray_sum(nums): if not nums: return 0 current nums[0] global_max nums[0] for num in nums[1:]: current max(num, current num) global_max max(global_max, current) return global_max关键在current max(num, current num)这一步如果前面累加的和还不如从当前元素重新开始那就果断抛弃前面的部分。这个“要不要抛弃过去”的决策模式在很多算法题里都能看到影子。更进阶的还有前缀和加最小值维护的方法先计算前缀和数组pre[i]然后遍历的时候动态维护pre[i]之前的最小前缀和最大值就是pre[i] - min_pre。这个方法在二维矩阵求最大子矩阵时能直接迁移实用性很强。这道题真正想考察的不只是你会不会背Kadane算法而是遇到一个看似简单的问题时能不能从暴力解法出发逐步分析时间复杂度进而推导出线性做法。面试官还会追问“如果数组变成二维呢”“如果允许非连续子序列呢”每一个追问都在考察你是否真正理解了问题本质。2.2 机器学习题为什么Logistic Regression用交叉熵而不是均方误差这一题几乎每年都会出现在各种算法笔试里2015年也不例外。问题形式可能是选择题也可能是简答题。核心是考察你对逻辑回归和损失函数原理的理解。逻辑回归的预测输出是p sigmoid(w·x b)表示样本属于正类的概率。训练时我们希望预测概率尽量接近真实标签。如果采用均方误差MSE作为损失函数即L (y - p)²虽然直觉上“预测错了就惩罚”但做梯度下降时会遇到一个严重问题。sigmoid函数的导数在两端会趋近于0而MSE对参数w的梯度中会包含sigmoid(z)这个因子。当预测概率接近0或1即模型已经很确定但方向给错了的时候梯度会变得非常小参数更新几乎停滞这就是梯度消失。而用交叉熵损失也就是对数似然的相反数梯度的形式就变了不再包含sigmoid(z)这个衰减项误差越大梯度越大模型收敛速度明显更快。从另一个角度看我们假设样本标签服从伯努利分布逻辑回归做的就是估计这个分布的参数所以最大似然估计自然导出交叉熵损失。MSE假设的是高斯分布下的最大似然但二分类标签显然不是高斯分布。因此选损失函数本质上是在选“你假设数据服从什么分布”。这一点想通了很多模型设计问题都会豁然开朗。这道题后来在我实际调模型时也经常用到当模型在训练初期loss降不下去时我总会先检查损失函数和激活函数的搭配是否合理而不是盲目调学习率。2.3 概率论题贝叶斯公式怎么变成垃圾邮件分类器概率统计题在当年的卷子里分量很重。最经典的莫过于“贝叶斯公式应用题”假设某个词“优惠”出现在垃圾邮件中的概率是20%出现在正常邮件中的概率是2%邮件中垃圾邮件的整体比例是10%求一封包含“优惠”一词的邮件是垃圾邮件的概率。这就是标准的贝叶斯公式P(垃圾|优惠) P(优惠|垃圾) * P(垃圾) / P(优惠)其中P(优惠) P(优惠|垃圾)P(垃圾) P(优惠|正常)P(正常)。代入数据0.2 * 0.1 / (0.2 * 0.1 0.02 * 0.9) 0.02 / 0.038 ≈ 0.526。也就是说看到“优惠”这个词后垃圾邮件的概率从先验的10%一下子上升到约53%。这道题考察的不只是会套公式更重要的是理解“先验概率”和“后验概率”的概念。真正的工程坑在于真实场景里P(优惠|垃圾)和P(优惠|正常)是从历史数据中统计出来的如果某个词只在垃圾邮件里出现、从未在正常邮件里出现就会得到概率为0导致后验概率直接被归零。这个问题的标准解法是拉普拉斯平滑给每个词的计数都加一个很小的常数避免零概率。这个细节我在后来的文本分类、用户画像标签计算里遇到过无数次几乎是所有“从样本估计概率”类问题的基础。3. 当时那道“贴业务”的应用题推荐召回你要怎么设计应用题是当年卷子里最让我印象深刻的。题目大致是假设你在为某电商App的首页信息流设计商品推荐现在只有用户的历史行为数据点击、收藏、加购、购买以及商品的基础信息类目、价格、品牌。请你描述一套完整的推荐方案包括数据使用、算法选型、冷启动处理、效果评估。这类题听起来开放其实背后有一套固定的答题逻辑只要你掌握框架就能答得完整、有层次。当时我因为在实验室做过推荐系统的课设答得还算顺手。复盘下来核心是四个关键词召回、排序、兜底、评估。3.1 答题的第一层区分召回和排序不要混为一谈很多同学一上来就说“要用协同过滤、要用LR”但完全没提“先海选再精排”的流程这在面试官眼里是缺乏工程思维的。推荐系统第一件事是召回从全量商品库中选出一个几十到几百的候选集合然后才是排序。召回阶段追求的是“不要漏掉用户可能感兴趣的东西”排序阶段才是“把最可能点击/购买的商品放在最前面”。2015年时推荐系统的主流召回方案大概是这几类基于规则的召回用户最近浏览过同品类、同价格带的商品直接把相似价位段商品拉出来热门商品作为保底召回。基于Item-based协同过滤计算商品之间的相似度根据用户历史点击过的商品找到相似商品作为候选。这种方式在电商里效果非常直接因为用户意图明确而且商品相似度可以离线计算线上延迟低。基于User-based协同过滤找到与当前用户行为相似的其他用户把那些用户购买过的商品推荐给当前用户。适合做惊喜度较高的推荐。基于内容的召回利用商品标题、类目、品牌文本做关键词匹配。逻辑简单对新商品友好。在回答这类题时千万不要只说一个方案而是要说“用哪几种方案做候选各自解决什么问题”。以多路召回为主体这是当年公认的工程实践。3.2 答题的第二层排序、兜底和评估才是拉开差距的地方召回完之后是排序。当年的排序主流是LR或GBDT。LR对大规模稀疏特征友好GBDT能自动发现非线性特征组合两者也经常叠加使用。值得注意的是排序阶段的特征工程远比模型选择重要用户维度特征历史点击率、购买力层级、商品维度特征类目、品牌、价格、用户-商品交叉特征用户最近7天是否点击过同品牌商品、场景特征当前时间、终端这类特征直接决定了排序效果上限。兜底策略是当年很多考生容易忘掉的部分如果一个新用户没有任何行为记录或者一个商品没有任何曝光怎么办通用的做法是热门商品冷启动再按地域、季节性做规则排序尽量避免完全空白。评价指标也要分开定义离线看AUC、线上看点击率、点击到加购转化率、下单转化率以及人均推荐商品曝光数等业务指标。这一整套“召回—排序—兜底—评估”在当时是一份高分答案的骨架。今天再看这套框架依然适用只不过召回环节多了深度学习向量召回排序从LR换成了DeepFM、DIN等模型但底层的工程思维完全一致。4. 做题以外的功夫从笔试到面试你还需要准备什么笔试只是第一关通过之后还有更叫人紧张的面试。我这些年的体会是面试官看到你的笔试成绩后会带着预设去考察你笔试里错过的题会追问做对的题可能被加深项目经历会被反复挖。所以笔试后的准备同样重要。4.1 笔试答卷里最常见、最可惜的五个丢分点结合我自己的考试经历和后来帮人改简历、做模拟面试的经验笔试丢分大多不是因为“不会”而是因为“细节没做到”。最亏的几类如下只写思路不写复杂度。一个算法题哪怕代码全对如果没有分析时间复杂度和空间复杂度面试官会怀疑你只是“碰巧写出来了”。边界条件全忽略。空数组、长度只有1的数组、全是负数的数组这类情况在暴力解法里很容易出错。代码写出后一定自己心里跑一遍边界用例。在一个题上耗太多时间。选择题里卡住了就快速选一个最可能的标记回头再看编程题如果5分钟没有完整思路先写暴力法至少拿到部分分数。代码不加注释、变量命名随意。笔试环境里面试官后续会看到你的代码整洁的命名和简单注释会直接影响“工程观感”这是很主观但真实的评分点。应用题写成“论文”没有结构。一句话一段、想到哪写到哪面试官根本没法快速抓住重点。正确做法是分条列点先结论后展开。4.2 笔试之后电话面和现场面大概率会追问什么通过笔试后一般会安排一轮面试。我当时经历的追问节奏大致是这样的首先让你介绍一两个自己做过的项目这会疯狂深挖包括数据怎么处理的、特征怎么选的、为什么选这个模型不选那个、遇到过什么难点、结果怎么评估。然后是手推逻辑回归或SVM纸上推导那种所以笔试复习时一定不要把公式背完就扔要能从头推一遍。接着是SQL题和场景题。比如“给定用户表、订单表统计每个用户的最近一次下单时间”“某商品点击率下降10%你如何分析原因”。这类题考察的是数据基本功和业务思维光会算法模型是不够的。有一件事我特别建议在面试前主动研究一下目标岗位的业务场景。当年我准备了阿里推荐场景的一些实际案例面试时能聊出很多细节和面试官之间很快就有了共鸣。相比反复背题这种“我在认真理解你们业务”的态度往往更能加分。5. 十年后再看这份卷子哪些变了哪些没变2015年到今天已经过去近十年。回看这份笔试卷我最强烈的感受是算法岗位的考察范围在快速变宽但对核心能力的考察逻辑非常稳定。底层的东西你掌握好了无论技术怎么迭代你都跟得上。5.1 从LR到LLM算法岗考察点的迁移2015年的题眼里机器学习部分停留在LR、SVM、贝叶斯这些经典模型的推导。今天再翻各大厂的算法笔试面试题大模型相关的Prompt工程、LoRA微调、模型量化推理比如不少人开始研究llama.cpp这类轻量推理引擎成了新宠深度学习框架、模型部署、推理优化等内容也越来越常见。画像算法岗会重点考察CNN、模型轻量化、检测分割运筹算法岗则更重视线性规划、整数规划、启发式算法。岗位越分越细考察点也各有侧重。但这不等于基础无用。我面过不少候选人简历上写着一堆深度学习项目却回答不出“为什么卷积层参数量变少但是效果反而更好”这种基础题这就很尴尬。模型更新换代再快底层的数据结构、概率统计、优化方法、编码能力依然是底盘。底盘不稳上层盖再高也会塌。5.2 给今天算法实习生的实用建议如果你正在准备这类笔试我愿意把实际工作里的几条心得分享出来。第一经典模型推导练到“肌肉记忆”。LR、SVM、决策树、朴素贝叶斯这些模型的损失函数、梯度、优缺点必须闭着眼都能写出来因为面试追问永远从它开始。我当时是把这些推导手写了好几遍后来工作里聊方案时依然受益。第二动手部署一个小模型比只看论文有用得多。比如训练一个文本分类模型然后在本地把推理接口跑通。这个过程会让你理解训练与部署的差距也能应付现在越来越流行的推理优化题。第三业务场景题不要背答案。准备的时候多看几个实际案例但答题时一定围绕自己的理解来组织。面试官最怕听到“标准答案式”的回答尤其当追问到具体细节时一旦露怯反而会扣分。第四刷题时注意培养“把复杂问题拆小”的习惯。笔试里很多看似庞大的系统设计题本质都是若干基础模块的组合。拆小之后每一步都能用最熟悉的数据结构和算法解决。最后再说一点我对这份卷子的总印象阿里巴巴这类大厂出笔试题从来不是要你背下某个题库而是用一张卷子模拟你之后几年真实工作里遇到的问题——阅读别人的代码、权衡多种方案、在有限时间内交付一个可用方案、把技术结论讲给业务伙伴听。所以准备笔试的过程本质上就是提前演练一段职业画像。带着这种心态去刷题、去复盘、去准备面试你会比那些单纯追求“最后一道编程题AC”的人收获多得多。