1. 2015年阿里算法工程师实习生笔试:真实考场复盘与考点拆解
1.1 这场笔试的背景与含金量
聊到2015年的阿里巴巴算法工程师实习生笔试,我到现在还记得自己在考场上的那种紧张感。那一年阿里校招的竞争没有后来那么卷,但算法岗的筛选已经明显有了自己的风格。很多同学以为算法工程师就是刷LeetCode、背机器学习公式,结果拿到卷子发现根本不是这么回事。它考的既不是单纯的数据结构题海战术,也不是纯数学推导,而是把业务思维、算法基础、代码能力和工程判断力混在一起考,时间还很紧。
这份试卷放在今天看,依然有很强的参考价值。原因很简单:阿里算法团队当时做的事——搜索排序、推荐系统、广告投放、供应链预测——决定了他们招人时最看重的是“用算法解决业务问题”的潜力,而不是“会多少模型”。所以试卷里既有KMP、排序、树这些计算机基础,也有大量概率统计、机器学习和场景设计题。如果你现在正准备大厂算法岗笔试,这篇复盘可以帮你少走很多弯路。
1.2 试卷整体格局:不是考你会不会,而是考你熟不熟
先说说整份卷子的结构。我记得大概是选择题、填空题、简答/计算题、编程题和一道综合设计题这么几大块。选择填空覆盖了数据结构、算法复杂度、操作系统、网络、概率论、机器学习基础,范围很广但深度不算变态。简答题里会有手写KMP next数组、复杂度的推导、贝叶斯计算这类需要你动笔的题目。编程题一般是两三道,风格偏“在特定约束下实现一个功能”,不是纯LeetCode原题。最后那道综合设计题,才是真正拉开差距的地方。
这里有个很关键的判断:阿里的笔试不是一个“及格性考试”,而是一个“排序性考试”。什么意思呢?就是它不指望你把每道题都做对,而是通过题目难度梯度,快速把候选人分层。我当年看到不少人卡在KMP的next数组上,结果后面的编程题根本没时间碰。这就是策略上的失误——你需要在拿到卷子的前五分钟就完成全局判断:哪些题是送分题,哪些题是苦力题,哪些题可以直接放弃。后面我会专门讲怎么分配时间。
2. 数据结构与经典算法:笔试的硬骨架
2.1 栈、队列与递归:藏在“简单题”里的功与过
先说基础。阿里2015年的笔试试卷里,栈和队列并没有单独出一道“实现一个栈”这种题,而是把它们藏在了表达式求值、括号匹配、递归转非递归这类组合题里。比如我印象里有一道题是给一个中缀表达式,要求用栈将其转换为后缀表达式,并计算复杂度。这题本身不难,但很多人会在这里犯错:只记得“遇到左括号入栈,遇到右括号出栈”的粗略规则,却忽略了运算符优先级的细节处理。
这类题背后真正的考点是“你有没有真正理解栈这个数据结构在系统底层的作用”。我当时复习的时候,喜欢用一个生活化的类比来理解:栈就像一摞盘子,你永远只能拿最上面那个;队列就像一群人排队,先来的先服务。递归调用就是典型的栈结构——函数不停的往下调用自己,每一层的局部变量都压在栈里,直到触底再一层层弹出返回。很多人写递归只背模板,不理解这个压栈和弹栈的过程,一旦遇到“请用非递归方式实现二叉树中序遍历”这种题就懵了。
关于非递归中序遍历,我建议你亲手推导一遍:用栈模拟递归过程中的调用栈。先把根节点一路向左压栈,压到最左节点之后开始弹出,每弹出一个节点就访问它,然后转向它的右子树继续压栈。这套逻辑想明白了,你不仅会写这道题,还能理解为什么中序遍历可以得到有序序列——因为二叉搜索树的左子树都小于根节点,右子树都大于根节点,中序遍历就是左根右的顺序,自然有序。这种“理解而不仅是记忆”的状态,才是笔试最需要的。
2.2 字符串匹配与KMP:当年很多人的分水岭
2015年那会儿,KMP算法几乎是各大厂笔试的常客,阿里也不例外。试卷里有一道题我记得特别清楚,给了模式串p="abacaba",要求写出它的next数组。这个考点在近几年的热词里还在反复出现,可见它的经典程度。
先说next数组的定义:next[i]表示模式串前i个字符组成的子串中,最长的相同前缀和后缀的长度(有些教材里定义不太一样,有的叫失配函数,有的是next[0]=-1的版本,考试时一定要看清题目给的约定)。以"abacaba"为例,我们从i=1开始逐项推导。
- i=1时,子串是"a",既没有前缀也没有后缀,next[1]=0。
- i=2时,子串是"ab",前缀集合有"a",后缀集合有"b",没有相等的,next[2]=0。
- i=3时,子串是"aba",前缀有"a","ab",后缀有"a","ba",最长公共前后缀是"a",长度为1,next[3]=1。
- i=4时,子串是"abac",最长公共前后缀为0,next[4]=0。
- i=5时,子串是"abaca",公共前后缀是"a",next[5]=1。
- i=6时,子串是"abacab",公共前后缀是"ab",长度为2,next[6]=2。
- i=7时,子串是"abacaba",公共前后缀是"aba",长度为3,next[7]=3。
所以最终next数组是0,0,1,0,1,2,3。这套手算过程看起来不难,但考场上很容易出错,因为大家习惯在代码里写“求next数组的代码”,而不是手工推导。我建议你考前专门练五到十个字符串的手算,找找感觉,特别要注意:next数组求的是“最长相等前后缀”,不是“最长回文串”,也不是“当前字符前一个位置的下标”,不少人会在这里混淆。
KMP的核心思想其实就一句话:失配时不要从头再来,而是利用已经匹配过的信息,把模式串向右滑动到合理的位置。这个“合理位置”就是由next数组决定的。理解了这个,你就明白了为什么KMP能把暴力匹配的O(mn)优化到O(m+n)——因为主串的指针永远不会回退,只前进,每次失配模式串只回退到next指定的位置。这种“用空间换时间、用预处理换匹配速度”的思路,本身就是算法工程师的基本功。
2.3 排序与查找:八股背后的复杂度直觉
排序算法在2015年阿里笔试里出了一道很有代表性的题:给出一组排序算法的平均时间复杂度和最坏时间复杂度,要求选出描述正确的组合。乍一看是送分题,实际上很多人栽在“快排最坏情况是O(n²)”和“堆排序最坏也是O(n log n)”这种细节上。
我把当时高频考的排序算法整理成一张表,你可以对照复习:
| 算法 | 平均时间复杂度 | 最坏时间复杂度 | 空间复杂度 | 稳定性 |
|---|---|---|---|---|
| 冒泡排序 | O(n²) | O(n²) | O(1) | 稳定 |
| 简单选择排序 | O(n²) | O(n²) | O(1) | 不稳定 |
| 插入排序 | O(n²) | O(n²) | O(1) | 稳定 |
| 希尔排序 | O(n^1.3)左右 | O(n²) | O(1) | 不稳定 |
| 归并排序 | O(n log n) | O(n log n) | O(n) | 稳定 |
| 快速排序 | O(n log n) | O(n²) | O(log n) | 不稳定 |
| 堆排序 | O(n log n) | O(n log n) | O(1) | 不稳定 |
关于稳定性,这里补一句:什么时候你会真的在意排序的稳定性?比如在推荐系统里,先按点击率排序,再按商品上架时间排序,如果用的是不稳定排序,前面点击率的相对顺序可能被破坏,导致最终结果不是“在时间新近的前提下点击率最高”,而是乱序。这种业务理解,笔试里未必直接考,但面试官很喜欢在聊项目时追问。
另一个常考的点是快排的partition过程和复杂度推导。我当年在复习时特意推演过:为什么快排平均是O(n log n)?因为每次partition大致把数组分成两半,递归深度是log n,每层要处理的总元素数是n。而最坏情况(比如数组已经完全有序,且你固定取第一个元素做pivot)下,每次只分成1和n-1两半,递归深度变成n,总复杂度退化成O(n²)。所以后来很多工程实现都用“随机选pivot”或者“三数取中”来规避最坏情况。这个细节放在编程题里,就是“你会不会写一个鲁棒的快速排序”。
3. 机器学习与统计基础:算法岗的“专业护城河”
3.1 模型评估与过拟合:一道题暴露你的工程直觉
如果说数据结构题筛的是“计算机基本功”,那机器学习题筛的就是“有没有做算法的sense”。2015年阿里笔试里有一道多选题,大概是给一个分类模型的训练集准确率是98%,测试集准确率是85%,问可能的原因有哪些。选项包括:模型过拟合、训练集和测试集分布不一致、特征维度太高、正则化系数太大。这道题几乎就是送分题,但它的价值在于提醒你一个非常重要的事实:阿里不考“什么是过拟合”这种背诵题,而是给你一个现象,让你反推原因。
过拟合这个概念,我常用的类比是“背答案”。一个学生如果只是把练习册的题目和答案一字不差背下来,做练习册时满分,一旦考试题目稍微变一变就傻眼。机器学习里的过拟合也是这样:模型把训练数据里的噪声和异常点也当成了规律,导致泛化能力差。解决方法无非是加正则化(L1让权重稀疏、L2让权重趋近于0)、增加训练数据、降低模型复杂度、做交叉验证调参。这些必须做到条件反射式地脱口而出,因为在后续面试中,面试官会围绕你项目里的过拟合问题反复追问。
关于正则化,L1和L2的区别值得多说一句。L1正则化会让很多权重变成0,相当于自动做了特征选择;L2正则化则让权重整体变小,但很少变成0。你可以把L1理解成“精简团队”:只留下最有贡献的人,其他人直接裁掉;L2理解成“全员降薪”:每个人都少拿点,但都还在岗位上。这个直觉对做稀疏特征场景很有帮助,比如广告点击率预估这种特征维度十万百万的场景,L1几乎必不可少。
3.2 聚类与分类:从原理到计算,一步都不能省
2015年那场笔试里有一道k-means的手算题,给了几个二维坐标点,初始聚类中心也给了,要求迭代一轮之后的聚类中心和簇划分。这类题目考察的是“你真的动手算过聚类过程,而不是只会调库”。我印象很深,因为当时班里不少同学都挂在最后一步:算新的聚类中心时要取簇内所有点的均值,而不是取中位数或随意指定一个代表点。
k-means这个算法,我建议每个准备算法岗的同学都手推一遍完整的迭代过程。假设我们有四个点A(1,1), B(2,1), C(4,3), D(5,4),初始中心是C1(1,1), C2(4,3)。第一轮:A离C1距离0,B离C1距离1,C离C2距离0,D离C2距离约1.41,C离C1约3.61,B离C2约2.83,所以A、B归C1,C、D归C2。第二轮,新的C1=(1.5,1),新的C2=(4.5,3.5)。再算距离发现A、B仍属C1,C、D仍属C2,收敛。这套流程这么顺畅,但考试时很多人会算错欧式距离的开根号,或者把整数点求均值后当成新中心却忘了坐标是浮点数。细节决定成败,真不是一句空话。
分类方面,朴素贝叶斯也是高频考点。它之所以叫“朴素”,是因为它假设特征之间相互独立。这个假设在现实中几乎不成立,但很多场景下它依然表现不错,而且计算极其高效。我记得笔试里有一道题给你一堆邮件样本,统计某些词在不同类别中出现的次数,让你计算一封包含特定词汇的邮件是垃圾邮件的概率。这种题本质上就是在考贝叶斯公式:P(类别|特征) = P(特征|类别) × P(类别) / P(特征)。算的时候要注意平滑处理,比如拉普拉斯平滑,否则某个词在训练集里没出现时概率直接变成0,就会把整个乘积清零。
3.3 特征工程与业务理解:阿里风格的“算法落地题”
阿里笔试的另一个特色是,它很少考“给你一个数据集,你用什么模型”,而是喜欢考“给你一个业务场景,你会怎么构建特征和选择模型”。这类题往往出在简答或者综合设计题中,比如预测下个月的销售额、给用户推荐商品、判断一笔交易是否有风险。答这类题时,最容易犯的错误是只谈模型不谈特征。实际上在工业界,特征工程决定了模型效果的上限,模型只是在逼近这个上限。
以商品推荐为例,我当年答题时是按这个框架来写的:用户特征(年龄、性别、历史购买类目、点击行为序列)、商品特征(价格、类目、品牌、历史好评率、近30天销量)、交互特征(用户与商品类目的历史点击率、购买间隔)、上下文特征(当前时间、季节、是否大促)。模型选择上,可以从LR、GBDT到FM/FFM逐步升级,但首次上线的MVP往往是逻辑回归或GBDT这类可解释性强、易调试的模型。这种“先业务后模型、先特征后算法”的答题思路,我认为是阿里这类公司最欣赏的。
顺便提一句,那个年代正是FM(因子分解机)在推荐系统里逐渐流行的时期。如果你在笔试里能写出“用FM建模二阶特征交叉,解决稀疏特征下的组合爆炸问题”,会让阅卷人眼前一亮。这个知识点到今天依然是推荐算法的基础,值得系统学一遍。
4. 数学基础与逻辑思维:容易被低估的送命题
4.1 概率统计题:三门问题、贝叶斯与条件概率
数学部分在2015年阿里笔试里占的比例不低,题型集中在概率统计和线性代数上。概率题里,有三门问题、抛硬币问题、条件概率应用题、期望计算题。这些题目难吗?知识点本身不难,难的是“在考场上能不能快速找到正确的计算路径”。
以贝叶斯公式为例,我记得有一道题是这样的:某种疾病的发病率是0.1%,检测试剂的准确率是99%,也就是有病的人检测出来阳性的概率是99%,没病的人检测出来阴性的概率也是99%。问一个人检测出阳性,他真正患病的概率是多少。这道题的答案是约9%,不是99%。很多人一下笔就写99%——这就是没有把“先验概率”带进去算。按照贝叶斯公式:P(患病|阳性)=0.001×0.99/(0.001×0.99+0.999×0.01)≈0.0902。这个9%和99%的巨大反差,恰恰是贝叶斯思维最迷人的地方:即使检测很准,在疾病本身极其罕见时,阳性结果也需要谨慎解读。
为什么算法工程师要懂这些?因为搜推广场景里大量问题都是不确定性推理。比如用户点了某个商品,他真正想买的概率有多大?这时候你不能只看点击行为本身,还要结合用户历史行为的先验分布。我在实际工作中发现,很多模型效果不好,不是模型不够强,而是工程师没有把正确的先验信息编码进模型里。
4.2 线性代数与优化:矩阵求导、梯度与收敛
线性代数的考点主要集中在矩阵乘法、特征值、正定矩阵、矩阵求导这些方面。2015年的卷子里有一道题让计算一个2×2矩阵的特征值,还有一道题涉及最小二乘法的正规方程。这类题考察的核心能力是:你能不能把“矩阵运算”和“优化目标”联系起来。
最小二乘法的正规方程是θ=(X^T X)^(-1) X^T y。这个公式看起来简单,但它背后的推导逻辑很漂亮:我们的目标是最小化误差平方和,把目标函数对θ求导并令导数为0,就能得到这个闭式解。这个过程中你需要会矩阵求导的规则。如果考试时记不住公式,也可以从几何角度理解:最小二乘的本质是把y投影到X列空间上,残差垂直于列空间。这个投影视角不仅帮你记公式,还能帮你理解为什么当X^T X不可逆时(比如特征共线),需要加正则化项——因为加了λI之后矩阵变成正定的,求逆就稳定了。
另一个常考的是梯度下降的收敛性。我记得有一道选择题问:当学习率过大时会发生什么。答案是损失函数可能会震荡甚至发散。理解这个很简单,你把梯度下降想成是下山:步子迈得太大会直接跨过山谷跳到对面山坡,甚至越跳越高。这个直觉在做深度学习调参时极其重要。现在很多框架默认帮你设了学习率,但当你从零开始训练一个模型时,学习率往往是最先需要调的参数,没有这个直觉你很难定位问题。
4.3 逻辑推理与智力题:时间管理的大坑
阿里笔试里还会有几道纯逻辑推理题,比如“有1000瓶药水和10只老鼠,其中一瓶有毒,怎么用老鼠最少的时间找出毒药”,或者“25匹马5个赛道,最少比赛几次找出前三名”。这类题目不是考算法,而是考“转化建模”的能力。
第一题的经典解法是二进制编码:给1000瓶药水编号,用二进制表示,10只老鼠对应10个二进制位,混合喂药后根据老鼠死亡情况反推出毒药编号。第二题的做法是:先分5组各跑一次,找到每组第一名;再让5个第一名跑一次,得出总排名;最后淘汰法,找出可能的前三候选,再跑一次决出二三。总次数是5+1+1=7次。
这类题放在试卷里,作用主要有两个。第一是考察你在信息不完整的情况下能否抽象出最优策略。第二是消耗你的时间——如果你在智力题上死磕很久,后面的综合题就危险了。我的建议是:逻辑推理题放在最后做,能做出来就做,做不出来就果断填一个相对合理的答案,绝对不要恋战。实际上,我那一批进面试的同学里,几乎没有人是在智力题上拿满分的,大家都在综合题上靠扎实的业务建模能力拉开差距。
5. 编程题与综合大题:从“会做”到“能过”
5.1 手写代码的评分逻辑:不只是AC
编程题是阿里笔试的重头戏,但和LeetCode不太一样的是,它更关注你的代码风格、边界条件处理和复杂度分析,而不是单纯追求AC。我经历的那场笔试,编程题大概有两三道:一道是链表相关的操作,一道是动态规划或贪心,还有一道和搜索有关。
我印象里有一道链表题是“给定一个单链表,判断它是否有环,如果有环返回环的入口节点”。这题有两个经典解法:哈希表记录访问过的节点,空间O(n);快慢指针,空间O(1)。面试官更期待的是快慢指针法,因为你能说出空间复杂度上的优势,说明你有工程意识。快慢指针的核心是:快指针每次走两步,慢指针每次走一步,如果链表有环,它们必定在环内相遇;相遇后,把慢指针(或一个新指针)放回头节点,两个指针都每次走一步,再次相遇位置就是环的入口。我记得这个结论在数学上是可以严格证明的,建议你亲手推导一遍,而不是死记。
动态规划题比较典型的是“最长上升子序列”或者“编辑距离”。这类题的难点不在状态转移方程的建立,而在于你是否能用“自底向上”的方式填表,以及如何优化空间复杂度。以编辑距离为例,二维DP表的每个格子dp[i][j]表示字符串A前i个字符转成B前j个字符的最小编辑次数,转移方程是:如果A[i]==B[j],则dp[i][j]=dp[i-1][j-1];否则dp[i][j]=min(dp[i-1][j], dp[i][j-1], dp[i-1][j-1])+1。写完二维版本之后,你要能进一步优化成一维滚动数组,因为dp[i][j]只依赖上一行和当前行的前一个位置。这种“从能跑到能省内存”的优化习惯,非常符合工业界对算法工程师的期望。
贪心算法在笔试里也出现过,比如活动选择问题。它的核心是“每次选结束时间最早的活动”,这个策略能保证全局最优。我在复习时发现,很多人搞不清贪心和动态规划的区别,这里给一个简单判断方法:贪心是每一步做局部最优决策且不回退,动态规划是枚举所有可能的决策并用状态记录中间结果。能用贪心解决的问题,都有一种“拟阵”结构,但考试不用理解这么深,你只需要记住几个经典例题,熟悉什么场景下贪心是可行的。
5.2 推荐系统场景题:把业务问题翻译成算法问题
综合设计题是整张卷子最有阿里味道的部分。2015年那场给了一个推荐相关的场景,要求你设计一个方案来提升某类商品的点击率或转化率。这题没有标准答案,但阅卷人可以通过你的回答看出你的思维框架是否完整。
我当时的答题思路分四步。第一步,明确问题:是要提升点击率还是转化率?目标不同,特征和模型选择完全不同。第二步,梳理数据和特征:可以用用户行为日志、商品信息、上下文信息,特征要细化为数值型、类别型、序列型。第三步,选择模型和评估方式:离线用AUC、GAUC等指标,上线用AB实验。第四步,给出冷启动方案和兜底策略,比如新用户没有行为数据时用热门推荐或基于内容的推荐。这套框架不是临时想的,而是我在准备时专门总结的一套“业务算法设计模板”。
这里要特别强调“评估”这个环节。很多同学的答案写到“用机器学习模型预测点击率”就结束了,几乎没有提到怎么做离线评估和在线AB实验。但实际工作中,一个模型90%的工作量在评估和调优上。你在笔试里能写出“通过GAUC衡量用户级别排序效果,通过AB实验验证线上指标是否显著提升”,会让你瞬间从候选人中跳出来。这说明你不只是一个会调包的人,而是真的有系统思维。
5.3 从笔试到面试:考完才是真正的开始
笔试结束后的48小时,往往是面试通知陆续发放的时间。在我看来,笔试最大的价值其实不是“过不过”,而是帮你把整个知识体系暴露了一遍。哪些地方薄弱,哪些地方是凭运气蒙对的,考完对一遍答案就知道了。我当年考完之后,用了整整一天时间把错题整理成一份文档,每个错题不仅写了正确答案,还写了“我当时为什么选错”的原因分析。这份文档后来成了我准备面试的宝贵资料。
面试环节里,面试官大概率会拿着你的笔试卷来追问。比如你在一道机器学习题上选了一个不合理的答案,面试官可能在面试时说:“我注意到你笔试里有一道题选择了XXX,你能再讲讲你的思路吗?”这时候如果你在笔试后认真复盘过,就能坦诚说出当时哪里想错了,现在怎么理解。这种“敢于承认错误并展示成长路径”的沟通方式,反而会给面试官留下好印象。所以,千万不要考完就扔,笔试复盘是校招准备链条里最划算的一环。
6. 实战路线与踩坑记录
6.1 我是怎么用30天准备这场笔试的
我当年准备这场笔试的时间线大概是30天,前15天过基础,后15天刷题加模拟。前15天里,我每天安排三块内容:上午数据结构与算法,下午机器学习与概率统计,晚上做一套模拟卷或专项练习。数据结构这块,我把栈、队列、树、图、排序、查找、KMP、并查集这些高频考点全部过了一遍,重点放在了“手写代码”上,因为笔试是要写代码的,光看不练等于白学。
机器学习这块,我当时学的是经典机器学习算法,包括逻辑回归、SVM、决策树、朴素贝叶斯、k-means、KNN、PCA等。每学一个算法,我要求自己做到三件事:写出损失函数和优化目标、说出适用场景和优缺点、能在纸上推演一个简单例子。这个“纸上推演”的习惯让我在笔试遇到手算k-means、朴素贝叶斯这类题时完全不慌。后15天,我每天固定刷题两小时,同时在牛客网找往年的阿里笔试模拟题来练手,掐表做题,培养考场节奏感。
6.2 考场上最容易犯的五个错误
根据我自己的实战经历和身边同学的反馈,我总结了考场上最容易犯的五个错误,每个都对应具体的规避方法。
第一个错误是在选择题上死磕。有些题明明不会,却非要花十分钟琢磨。我的原则是:一道选择题如果30秒内没有明确思路,先标记跳过,最后有时间再回来蒙一个。第二个错误是KMP手算next数组时疏忽定义。不同教材对next数组的定义不同,有的从0开始,有的从-1开始,考试时如果不仔细读题,很容易按错误定义算。
第三个错误是编程题直接上手写,不先规划。我见过很多同学在编程题上写了半天,最后发现算法思路不对,白白浪费了草稿纸和时间。正确做法是先花两三分钟想清楚算法和数据结构,甚至在草稿纸上画出关键步骤,再开始写代码。第四个错误是完全放弃综合设计题。综合题分数占比很高,即使你只能写出一个框架,也比空着强。哪怕只能列出特征、模型、评估三个小标题,阅卷人都能从中看到你的思考轨迹。第五个错误是时间分配不合理,前面所有题平均发力,导致最后的大题没有时间展开。关于时间分配,我建议用“50%时间做基础题,30%时间做编程题,20%时间做综合题”的大原则,再根据实际卷面微调。
6.3 给后来人的一份“考点自测清单”
最后,分享一份我在准备过程中沉淀下来的考点自测清单,你可以拿来对照查漏补缺:
- 你能随手写出KMP的next数组手算过程吗?能说出KMP相比暴力匹配的时间复杂度优势吗?
- 你能画出二叉树的三种遍历(前序、中序、后序)的递归和非递归实现吗?能说明为什么非递归要用栈吗?
- 你能说出快排、归并排序、堆排序的时间复杂度、空间复杂度和稳定性吗?能解释快排最坏情况什么时候出现吗?
- 你能手推k-means的一轮迭代吗?能解释k-means可能收敛到局部最优的原因吗?
- 你能用贝叶斯公式算出一个罕见的疾病检测问题吗?能解释先验概率对后验概率的影响吗?
- 你能给一个推荐场景,写出特征工程、模型选择、离在线评估的完整方案框架吗?
- 你能在半小时内完成一道链表、一道动态规划、一道贪心的中等难度代码题吗?
- 你能解释L1和L2正则化的区别,并说出各自适用的场景吗?
如果你对上面八成以上的问题都能给出清晰稳定的回答,那你面对2015年阿里这套笔试题,基本可以做到心里有底了。如果还有模糊的地方,我的建议是不要等,立刻打开书或者找一道对应的题来练手。算法笔试这件事,归根到底没有捷径,它要求的不是天赋,而是你愿不愿意静下心来把每个考点真正弄明白。我就是这样一步步走过来的,所以我相信你也可以。