iHandy校招算法与机器学习笔试题全解析:从KMP到模型评估 📅 发布时间:2026/9/1 12:08:57 👁 浏览次数: 前阵子整理硬盘翻出自己当年备战校招时收藏的“iHandy2019校招-机器学习/算法工程师笔试题”这套题又完整做了一遍。说实话虽然这套题是19年的但它考察的知识点非常经典和全面绝没有过时——算法与数据结构里的KMP、排序、贪心、图论机器学习里的模型评估、损失函数、正则化、经典模型对比一个不落而且难度拿捏得刚好能看出出题人是真想筛出基础扎实、能直接上手干活的人。这篇文章我就把这套题按考察维度拆开揉碎逐题分析出题人想考什么、背后是什么原理、现场遇到该怎么答、有哪些坑必须避开。不管你是正在准备算法/机器学习方向校招的应届生还是想查漏补缺的初级工程师这篇文章都能帮你把散落的知识点串成体系。我会尽量用“过来人讲题”的方式展开不堆公式但关键推导和手写代码会完整给出。1. 整体考察逻辑与出题思路拆解1.1 笔试的四个考察维度先看这套题的整体结构它基本是四个层次基础理论、代码功底、数学功底、工程思维。基础理论数据结构、排序、KMP、贪心、机器学习模型与算法原理。代码功底手写快排、归并、KMP、动态规划等考察基本功是否扎实。数学功底概率统计贝叶斯、期望、方差、最优化梯度下降、信息论熵、交叉熵。工程思维特征工程、模型评估、数据不平衡、开放场景题。这四个维度不是割裂的题目经常交叉出题比如给你一个业务场景让你选模型、定指标、做特征工程这就是综合题。我见过很多同学把精力全花在深度学习上反而不重视基础。但校招笔试阶段深度学习内容占比其实不高因为应届生只要能证明“有潜力、基础好、能培养”就够了。真正拉差距的反而是传统算法题和机器学习基础理论题这俩只要踏实复习是能稳定拿分的。1.2 出题风格与筛选逻辑iHandy是做移动互联网工具类产品的旗下有几款全球用户量很大的清理、图片处理类App。这类公司的算法岗实际工作更多是偏向策略、推荐、用户画像、内容理解这类通用机器学习应用而不是纯学术研究。所以它的笔试题风格非常“工业实战导向”不考你“能否背出Transformer所有公式”而是考“排序算法为什么不稳定的场景用不了”“KMP的next数组怎么求”“LR和SVM的区别”“AUC怎么算”“样本不平衡怎么处理”。这些问题都是在实际业务中真正会遇到、需要理解清楚的底层问题。出题人的筛选逻辑很清晰基础不牢的同学题目看起来都眼熟但一做就错基础扎实的同学则能在有限时间内稳定得分。这套题的区分度做得很到位所以用来作为校招算法方向的自我检测模板非常合适。1.3 时间分配与答题顺序建议笔试通常限时我建议拿到卷子先花两分钟扫一遍全卷做到心里有数然后按“先易后难、先分高后分低”的原则作答。选择题/判断题快速做完会就选不会先蒙一个并标记不浪费时间。填空题/简答题只需要答案和简要推导控制在每题不超过8分钟。手写代码题务必先设计思路、确认边界条件再动笔写。写完留2分钟自查。场景开放题看清要求按“业务目标→指标→数据→特征→模型→上线与评估”来组织答案宁可结构完整也不追求某个单一方案的完美。如果卡在某道题超过15分钟还没思路果断放弃先拿能稳拿的分回头有时间再研究难题。这套题题量不小很多人挂在“某道题上死磕导致后面大题没时间做”这个点上。2. 传统算法与数据结构核心题精解2.1 KMP算法与next数组推导高频必考这套题里出现了经典的KMP题型给模式串“abacaba”求next数组。这个题几乎是所有算法笔试的“必考钉子户”。原因很简单KMP是“理解字符串匹配底层思想”与“数组下标细节处理”的试金石。先明确next数组的定义。不同教材对next数组定义有细微差别答题前一定要看清题目是否给了定义。常见两种定义定义一next[i]表示模式串前i个字符组成的子串中最长相等前后缀的长度通常next[0]-1或next[1]0。定义二next[i]表示失配时模式串应该跳转到的位置下标这种把前缀和后缀比较的推导统一在失配位置前。以“abacaba”为例按最常见的“前缀函数”定义next[i]为长度为i的前缀的最长公共前后缀长度next[0]-1next[1]0来手推一遍。模式串每个字符索引如下下标0a下标1b下标2a下标3c下标4a下标5b下标6a手推过程next[0] -1。i1子串“ab”最长相等前后缀长度为0next[1]0。i2子串“aba”前缀“a”等于后缀“a”长度1next[2]1。i3子串“abac”前缀“a”不等于后缀“c”前缀“ab”不等于后缀“ac”没有相等前后缀next[3]0。i4子串“abaca”前缀“a”等于后缀“a”长度为1再看“aba”与“aca”不相等所以next[4]1。i5子串“abacab”前缀“ab”等于后缀“ab”长度2“a”和“b”都相等且不存在更长公共前后缀next[5]2。i6子串“abacaba”前缀“aba”等于后缀“aba”长度3next[6]3。所以这套题里如果按这个定义答案就是[-1, 0, 1, 0, 1, 2, 3]。如果题目把next[i]定义为“失配时的跳转位置”那通常是把上一步算出的长度值直接当作跳转下标所以逻辑上是一致的只是呈现形态不同。手写KMP的Python代码如下def get_next(p): n len(p) nxt [-1] * n i, j 0, -1 while i n - 1: if j -1 or p[i] p[j]: i 1 j 1 nxt[i] j else: j nxt[j] return nxt def kmp_search(s, p): nxt get_next(p) i j 0 while i len(s) and j len(p): if j -1 or s[i] p[j]: i 1 j 1 else: j nxt[j] if j len(p): return i - j return -1这里有个现场非常容易踩的坑next数组的长度和初始值。有些同学把next[0]设成0然后整个推导就乱了。KMP的next数组和模式串下标有强关联建议统一按照“next[0]-1”这个约定来记忆和推导写代码时注意循环边界是i n - 1因为循环体里会先i再赋值小心别越界。2.2 排序算法横向对比与手写要点这套题中排序相关知识点考得很细不仅有常见的复杂度问题还有稳定性、适用场景、优化点以及手写代码。我直接给一张自己整理的横向对比表这些年面试前我都会翻一遍。排序算法平均时间复杂度最坏时间复杂度空间复杂度稳定性场景特点冒泡排序O(n²)O(n²)O(1)稳定基于相邻交换基本有序时性能可优化选择排序O(n²)O(n²)O(1)不稳定交换次数最少但比较次数固定插入排序O(n²)O(n²)O(1)稳定小规模数据/近似有序时非常快希尔排序O(n log n)~O(n²)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)不稳定原地排序适合Top-K问题这里有一个高频理解题为什么快速排序不稳定因为核心操作是“交换”交换会跨过相等的元素使得相对顺序被破坏。比如数组 [3a, 3b, 2]以第一个3a为枢轴时3b会被交换到3a后面两者相对顺序就变了。所以凡是基于“交换且跨越较远距离”的排序通常都不稳定。手写快排是必考项目。我推荐一种最不容易写错的写法用“左右指针枢轴值”def quick_sort(arr, left, right): if left right: return pivot arr[left] i, j left, right while i j: while i j and arr[j] pivot: j - 1 arr[i] arr[j] while i j and arr[i] pivot: i 1 arr[j] arr[i] arr[i] pivot quick_sort(arr, left, i - 1) quick_sort(arr, i 1, right)注意这里我用的是“先移动右边j再移动左边i”的顺序。这个顺序必须固定否则会出现覆盖错误。原理是先把pivot值单独保存在变量里数组首位相当于空位先用j从右往左找比pivot小的值填到空位这样j位置又成了空位再用i从左往右找比pivot大的值填到j的位置最后ij时把pivot放回去。如果顺序反了起始空位在左边你却先动左边的i会把本来应该保留的值覆盖掉逻辑就乱了。归并排序的代码也常考尤其是“合并两个有序数组”这一内层逻辑。手写时需要注意合并过程需要额外O(n)空间这就是归并非原地排序的原因。但它的最大优势是稳定且最坏情况也是O(n log n)所以对于链表的排序归并反而是最优选择之一因为链表不需要额外搬移元素只需要改指针。2.3 贪心算法与动态规划的判断边界这套题里有贪心算法的题目具体到某题的变体核心考的是“你能否判断一个题该用贪心还是动态规划”。我拿一个最常见且容易混淆的例子来说明硬币找零问题。假设有硬币面额 [1, 5, 11]要凑出15元问最少需要多少枚硬币。如果单纯用贪心1111114不对11111是14再加一个1是15需要5枚。但最优解是555只用3枚。所以这个题贪心策略失效必须用动态规划。从这个例子可以总结一条判断规则贪心算法成立的前提是“局部最优能推出全局最优”做题时先看看是否存在反例。而动态规划的核心是“最优子结构 重叠子问题”只要状态定义和转移方程想清楚一般不会错。这一类题在笔试中特别爱出。我的答题习惯是先用简单的反例测试贪心是否成立如果不成立就果断切换DP。手写DP时直接从“状态定义→初始化→转移方程→遍历顺序→返回结果”五步走结构清晰不容易漏。2.4 图算法与启发式算法难度分级与复习策略这套题里还出现了Dijkstra最短路径、二分图HK算法、粒子群算法PSO、模拟退火等关键词。它们难度和考频不同复习策略要区分对待。Dijkstra是图论里的核心算法必须能默写。它的朴实现复杂度O(V²)堆优化版O((VE)logV)后者更应该熟练掌握。笔试中一般会出“求单源最短路径”并追问如何记录路径。注意Dijkstra只适用于所有边权非负的图如果边权有负数就要用Bellman-Ford。二分图HK算法属于较进阶的图匹配算法如果笔试出现通常是作为加分项或选做题。它的名字听起来复杂核心其实是“用BFS构建增广路径层次再用DFS寻找多条增广路径”的分层匹配优化。如果时间紧张我建议先把匈牙利算法搞懂HK可以留到复习有余力时再看。毕竟绝大多数校招笔试光靠匈牙利算法已经能拿分。粒子群算法和模拟退火属于启发式优化算法笔试题很可能以简答题形式出现比如“简述粒子群算法的原理和流程”。这类题的价值在于考察你有没有知识广度。我的回答模板是先说是什么模拟鸟群觅食的群体智能优化算法再说核心要素粒子位置、速度、个体最优pbest、全局最优gbest、惯性权重、学习因子最后说更新公式。把公式写出来再给一句“收敛快但容易陷入局部最优常用于连续优化问题”基本就是满分答案。3. 机器学习理论考点精讲3.1 模型评估指标从混淆矩阵到AUC机器学习的核心考点里模型评估是必考项。这套题里必然有混淆矩阵相关的题目。做这类题一定要先搞清楚混淆矩阵四个值分别是什么TP真正例预测为正实际为正FP假正例预测为正实际为负FN假负例预测为负实际为正TN真负例预测为负实际为负然后衍生指标准确率 Accuracy (TPTN) / (TPFPFNTN)精确率 Precision TP / (TPFP)召回率 Recall TP / (TPFN)F1 2 * Precision * Recall / (Precision Recall)这里有个万年易错点精确率和召回率不是“此消彼长”的关系可以直接互相指代它们的数学定义不同业务含义也不同。精确率关心“预测为正的里面有多少是真正”召回率关心“真正的正样本里有多少被找回来了”。AUC是另一个高频考点。它的定义是ROC曲线下的面积等价于“随机取一个正样本和一个负样本正样本预测得分高于负样本预测得分的概率”。这个理解很重要因为很多面试官喜欢追问“为什么用AUC而不用准确率”答案核心是AUC对样本不平衡不敏感。比如100个样本里99个负样本1个正样本全预测负样本也能有99%准确率但AUC只有0.5左右。所以二分类的评估AUC往往比准确率更能反映模型的实际区分能力。3.2 偏差方差分解与过拟合应对“过拟合”是机器学习简答题中的绝对高频。回答时需要提到偏差和方差的视角。偏差Bias模型在训练集上的拟合能力偏差大容易欠拟合。方差Variance模型在不同训练集上的波动程度方差大容易过拟合。复杂模型比如高次多项式、深层树模型通常偏差低但方差高在训练集上表现很好一旦换数据就崩。简单模型则相反。所以模型选择的本质就是在偏差和方差之间做权衡。然后一定会被追问怎么解决过拟合我的回答框架是增加训练数据或者做数据增强。降低模型复杂度比如减少树深度、剪枝。正则化加L1/L2惩罚项。集成学习比如随机森林的bagging、GBDT的正则化参数。早停Early Stopping在验证集指标不再提升时停止训练。Dropout神经网络场景。对于L1和L2正则化的区别必须连“为什么L1会稀疏”也说清楚。直观理解是L1正则对应的约束区域是菱形L2是圆形L1的极值点更容易出现在坐标轴上所以很多维度的权重会被压成0达到特征选择的效果。严谨证明是通过KKT条件的梯度分析但笔试只要画出示意图说出直观原因就足够拿分。3.3 损失函数与优化器踩过的坑都写在里面损失函数这块最常考的是MSE和交叉熵的选择问题。如果做二分类任务输出层用Sigmoid损失函数应该用什么很多同学第一反应是“MSE也能用呀”。确实能但效果很差。原因是MSE配合Sigmoid会让梯度变得很小梯度里多了一个Sigmoid导数的因子而这个因子在两端接近0导致靠近分类边界后模型训练几乎停滞。交叉熵配合Sigmoid的梯度形式干净能提供足够大的梯度信号加速收敛。所以分类问题选交叉熵回归问题选MSE这是个基本共识。实际题目里还可能直接让你计算交叉熵的值这种纯计算题关键在于看清log的底数通常用自然对数e为底。优化器也是热门考点。从梯度下降GD到随机梯度下降SGD再到Adam考察重点在于SGD每次用一个样本或一小批样本更新梯度比全量GD更快、更省内存。Momentum引入动量项加速收敛减少振荡。Adam结合Momentum和RMSProp自带自适应学习率在大多数场景下表现稳健。如果被问“Adam为什么好用”可以从“每个参数有自己独立的学习率”“对梯度大小不敏感”“适合稀疏梯度”几个角度回答。我的经验是笔试简答题把每个部分写两三句关键特性就能拿满复杂推导了解即可。3.4 经典模型对比LR、SVM、GBDT、朴素贝叶斯这套题里的经典模型对比是重头戏。我整理了高频的几个对比直接背下来在笔试和面试都有用。LR vs SVMLR是概率模型输出有概率意义SVM是几何间隔模型输出距离可加工成概率但原始输出不是概率。LR对全局样本敏感SVM只对支持向量敏感。LR损失函数是交叉熵对数损失SVM损失函数是hinge损失。线性SVM与LR决策边界都是线性的在无核函数情况下但SVM天然支持核技巧可以处理非线性LR则需要手动做特征组合或变换。数据量大的场景LR更常见因为训练速度可控、可分布式SVM在大数据量下容易吃不住。如果问“什么时候用LR什么时候用SVM”我的回答是特征维度高、非线性不强、对可解释性和概率输出有要求时用LR小样本、高维、需要非线性决策边界时用SVM。GBDT vs 随机森林随机森林是bagging并行训练很多棵独立引入随机性的树最后投票/平均降低方差。GBDT是boosting串行训练每棵树拟合前一棵树的负梯度残差近似降低偏差。随机森林抗过拟合能力强GBDT更容易过拟合但对拟合能力更强。在表格数据上精心调参的GBDTXGBoost/LightGBM通常是精度最强的选择。朴素贝叶斯为什么“朴素”因为假设所有特征在给定类别条件下相互独立。这个假设在现实里几乎不成立但它的优点是计算简单、训练快速、可解释性强在文本分类垃圾邮件过滤、情感分类等场景效果依然不错。追问“如果特征不独立怎么办”时回答“可以用半朴素贝叶斯引入超父依赖或用更复杂的模型”能体现你知识广度。3.5 聚类与降维K-Means、DBSCAN与PCA聚类部分会考K-Means和DBSCAN的对比。K-Means的思路是随机选K个中心点迭代交替执行“分配样本到最近中心”和“更新中心为簇内均值”。它的局限很明显需要预先指定K对初始中心敏感无法发现任意形状的簇。DBSCAN基于密度不用给K能发现任意形状簇还能识别噪声点但参数epsilon和min_samples对结果影响较大。手撕K-Means时注意初始中心的选择会影响结果推荐先跑一次K-Means或多次随机初始化取最佳结果。这个细节能体现你的工程经验。PCA降维通常考它的数学原理。PCA最大方差理论的要点是找到一组正交基使得数据投影后方差最大因为方差越大代表信息保留越多。它本质是对协方差矩阵做特征值分解取前K个最大特征值对应的特征向量作为投影方向。笔试中如果问“PCA之前为什么要做标准化”是因为PCA对尺度敏感如果不标准化量纲大的特征会主导方差。这个点很多同学会漏答出来就是加分项。4. 场景题与开放题应对4.1 机器学习应用流程拆解从业务目标到线上监控场景开放题在校招笔试里越来越常见。这类题没有唯一答案考察的是你有没有完整、可落地的机器学习解决方案能力。我建议所有场景题都按这个流程来组织答案第一步明确业务目标把业务问题转化为机器学习问题分类、回归、排序还是聚类。第二步确定评估指标离线指标AUC、F1、MAP等和在线指标点击率、留存率、收入等要分开。第三步盘点数据来源明确正负样本的定义与构造方式。第四步特征工程包括原始特征、交叉特征、特征标准化与缺失值处理。第五步模型选型从解释性、效果、训练成本等多个维度对比。第六步离线评估与上线方案包括A/B测试设计、灰度发布、监控体系。例如如果题目是“给一款清理工具类App设计一个垃圾文件识别策略”。按上面的流程可以这么答先把问题转化为“文件是否为垃圾文件”的二分类问题评估指标用精确率和召回率结合F1因为漏掉垃圾文件影响小但误删用户文件影响极大所以精确率优先数据来源考虑文件类型、大小、路径、访问时间、后缀名、是否在系统目录、用户手动清理反馈等特征工程上重点构造“文件新鲜度”和“目录类型”这类强特征模型可以选择LR或GBDTLR版本适合初版快速上线上线前做离线AUC验证上线后做A/B测试实时监控用户投诉率。这个回答框架能覆盖80%的踩分点。4.2 典型开放题示例与踩分结构我再举一个高频开放题“面对样本不平衡的二分类问题你会怎么做”直接背这个答案框架数据层面欠采样随机欠采样、EasyEnsemble、NearMiss等、过采样SMOTE、数据增强。算法层面调整类别权重比如scikit-learn里的class_weight或使用代价敏感学习。评估层面不用准确率改用Precision、Recall、F1、AUC、PR曲线。模型层面尝试异常检测思路把少数类看成异常点或分治思路把问题拆成多个子问题。业务层面明确错分代价说不定少数类比多数类更重要需要单独设计决策阈值。这个答案的特点是有层次从“怎么改数据”到“怎么改模型”再到“怎么评估”覆盖全面。阅卷人一眼就能看出你有实战经验而不只是背书。另一个经典开放题是“你会怎么给用户推荐App”。这类推荐系统题的答题要点先确定用户-物品矩阵再做召回和排序两阶段。召回阶段用协同过滤、向量召回如item2vec、双塔模型排序阶段用LR、GBDT或DeepFM最后结合业务规则做多样化调整。这样即使没有深度学习背景也能用传统方法完整体现推荐系统的知识结构。4.3 开放题避雷指南别主动挖坑我在批改和复盘中发现开放题最容易翻车的地方不是方案不够高级而是逻辑不自洽。比如问“样本不平衡怎么处理”有人上来就喊“用SMOTE”但如果连正负样本比例、数据量都不知道直接推SMOTE就显得生硬。更好的表达是“先看比例和数据规模再决定用欠采样还是过采样”。还有一类典型的送命题开放题里你写了一个“上线A/B测试”但完全没提“如何设计实验、如何划分流量、如何判断显著性”。如果面试官顺着追问你可能会暴露知识盲区。所以答题时宁可少些炫技也要保证每个名词背后你都懂原理。我的建议是答案部分尽量做“结构化表达”用“维度标题关键词一句话解释”的方式呈现。这样阅卷人扫一眼就能抓到要点你自己写起来也不会跑题。5. 备考路线与避坑经验总结5.1 复习资料与优先级安排如果你现在打算系统备战类似难度的校招笔试题我建议按以下优先级和时间比例来分配算法与数据结构大约40%精力LeetCode高频题按“数组、链表、树、图、动态规划、贪心、字符串”分类刷。重点掌握每种题型的模板式解法不做偏题怪题。机器学习基础大约35%精力周志华《机器学习》西瓜书核心章节配合吴恩达机器学习课程巩固理工直觉。重点复习模型评估、线性回归、逻辑回归、SVM、决策树、集成学习、聚类、降维。概率统计与线性代数大约15%精力贝叶斯公式、期望方差、最大似然估计、特征值分解、矩阵求导。这些是数学题的来源。场景题与项目复盘大约10%精力把自己做过的项目整理成“业务问题→指标→数据→特征→模型→上线效果”的完整故事并准备好追问。看到热搜词里有“机器学习 周志华 pdf”“山东大学机器学习期末”“机器学习期末复习”这些搜索词说明很多同学选的是“期末复习模式”——只顾背书不刷题。但是笔试和期末考的区别在于笔试更看重你能否动手推导和写代码尤其是手写的算法题光看书是永远写不出来的。5.2 手写代码最容易翻车的三个细节第一个是边界条件。很多同学快速排序写得很顺但忘了处理空数组和单元素数组的情况递归直接栈溢出。笔试时在函数开头加上if n 1: return arr这种判断是基本素养。第二个是循环退出条件。写归并排序的合并逻辑时两个子数组的索引i和j容易越界。正确的做法是在循环内先判断if i len(left):就直接把right剩余部分接上。第三个是比较操作的偏序关系。比如你写一个“按分数从高到低排序分数相同按年龄从小到大”如果用自定义比较器一定要明确返回值的正负号含义。Python 3里的functools.cmp_to_key踩坑概率极高笔试建议直接用sort(keylambda x: (-x.score, x.age))这种一行写法。5.3 笔试过程中的策略性技巧答题顺序之外还有几个现场技巧值得说。第一手写代码题先写思路摘要再写代码。就算代码没完全跑通思路清晰也能给阅卷人留下好印象——很多算法题是按步骤给分的。你写了个“用堆维护Top-K”的步骤说明哪怕最后一步实现有误也比直接甩一段没注释、没思路的代码强。第二涉及概率推导的题一定要把公式推导过程写出来不要只写结果。阅卷人对过程给分而且推导过程本身能帮你发现计算错误。第三遇到不会的题不要空着。开放题只要写满结构合理的回答总会有基础分选择题就算蒙也至少要填一个选项。这个朴素技巧在笔试现场往往等于好几分。第四长时间刷题后容易陷入“看什么题都像做过”的误区。到了最后半个月与其大量刷新题不如把错题本里的题重新过一遍。这套校招笔试题本身也是一个很好的错题本来源——做题不在多在精每道题分析清楚考察的知识点和易错点效果远好于麻木刷题。5.4 从笔试题反推岗位能力模型最后我想说一点更深的理解。一套好的笔试题其实是在刻画这个岗位的能力模型。从iHandy这套题可以看出2019年算法工程师岗位要求的是扎实的算法功底、牢固的机器学习理论基础、把业务问题转化为数学问题的能力、以及在工程实现时对细节的把控。放到现在来看这些基础要求并没有因为深度学习的普及而改变。深度学习只是工具箱里多了一类更强大的模型但“如何定义问题、如何评估模型、如何设计特征、如何上线监控”这些核心能力无论技术栈怎么演化都是算法工程师的立身之本。所以在复习阶段不要只盯着Transformer、Prompt、多模态这些热度高的新名词而忽略了对基础知识的打磨。我见过太多同学能聊半小时大模型但一问AUC怎么算就支支吾吾一问为什么不用MSE做分类就答不上来——这样的人在校招笔试环节就会被筛掉。我个人的体会是校招笔试真正拉开了“会背题”和“真懂”两类人的差距。如果你正在备战这类笔试与其焦虑题目刷不完不如先把这套基础题做透弄清楚每道题背后的“为什么”。基础扎实了后面的路自然顺。最后再分享一个实用小技巧考前一天不要刷难题把手写快排、归并、KMP、二分查找、DP模板各默写一遍把常用评估指标公式、GBDT/LR/SVM对比要点各过一遍然后早睡。相信我第二天考场上你会感谢这短短四十分钟的“保温练习”。