
考完途虎养车2023秋招算法笔试试卷A之后我缓了好几天才愿意复盘这套题。倒不是题难到离谱而是它考察的广度确实超出很多人的预期——既有传统数据结构算法的硬功夫又掺了不少机器学习、深度学习、甚至图像处理和优化算法的内容。如果你正在准备汽车后市场、O2O平台这类互联网公司的算法岗这套试卷A很有参考价值。下面我结合自己做题时的体验和出题逻辑把整套卷子的考点、陷阱和备考策略一次性讲透。1. 试卷A的整体风格拼的不是单点技巧而是算法视野的宽度先说结论途虎这套笔试试卷A的定位非常明确——它不追求在某一类难题上把你难倒而是通过多维度考察来筛出“算法基础扎实、业务理解到位、知识面广”的候选人。这和纯互联网大厂比如字节、阿里的算法笔试风格有明显差异后者更看重动态规划和复杂数据结构的手撕能力而途虎的卷子明显更贴近业务。从题型结构来看试卷A大致可以分为四块数据结构与基础算法、机器学习与深度学习基础、数学与优化类问题、以及业务场景应用题。其中数据结构部分的题目量占比最高大概四成机器学习与深度学习的题目占了近三成数学和优化类的问题约占两成最后还有一两道结合途虎业务的开放题。这种结构其实暗含了途虎对算法岗的真实需求。作为汽车后市场的头部玩家途虎的算法团队要处理的问题非常杂车型识别图像分割、分类、保养件匹配推荐、检索、库存预测时间序列、定价策略运筹优化、用户增长机器学习模型都有涉及。所以笔试不可能是清一色的LeetCode风格题而是要把这些领域都扫一遍。还有一个细节值得注意试卷A的选择题和填空题占了不少分这些题考察的是概念理解和原理辨析而不是单纯的代码输出。比如有一类题是给出一段小代码让你判断时间复杂度或者输出结果还有一类是给出算法名称和适用场景的匹配题。这种题对“背题党”非常不友好因为需要你真的理解算法的原理和边界条件。从我自己的做题感受来看这份卷子的节奏也比较紧凑。基础题部分如果顺利大概能留下四十分钟给后面的代码题和开放题如果一开始在概念题上犹豫太久后面就会比较被动。所以我的第一条建议是拿到卷子先整体扫一遍题判断哪些题是自己能秒杀的优先做掉把分拿稳再回头啃硬骨头。2. 数据结构与基础算法这些高频考点几乎必考2.1 排序与复杂度不只是会写冒泡和快排要懂它们在真实场景里的取舍排序几乎是所有算法笔试的常客途虎的试卷A也不例外。但和很多公司直接让你手撕快排不同这份卷子更爱考排序算法的性质辨析。比如冒泡排序在最好情况下的时间复杂度是多少为什么可以优化到O(n)堆排序为什么是不稳定的它的建堆过程时间复杂度为什么是O(n)而不是O(n log n)快速排序在最坏情况下会退化到O(n²)何时会发生如何避免这些问题看似基础但恰恰是很多人复习时容易忽略的细节。我印象很深的是关于堆排序稳定性的题——很多人记得“堆排序不稳定”这个结论但被问到“为什么不稳定”时就会卡壳。堆排序在做筛选sift down时相同关键字的元素可能因为堆调整的顺序而改变相对位置所以必然不稳定。类似的快速排序的不稳定性来源于交换操作归并排序的稳定性来源于合并时对左半段元素的优先取用这些都是需要吃透的点。还有一个容易被忽视的点是不同排序算法在不同数据规模下的实际表现。试卷里有一道题是问“在数据量较小比如几十个元素的情况下哪种排序算法通常表现最好”答案是插入排序。原因是插入排序虽然平均复杂度是O(n²)但它的常数非常小没有递归调用栈开销对近乎有序的数据表现尤其好。实际工程中很多标准库的快排实现比如C的std::sort在递归到小区间时会切换到插入排序就是这个原因。2.2 字符串与经典算法KMP的next数组是送分题还是送命题字符串算法在试卷A里占了不小的比例。其中KMP算法几乎是必考的而考察方式通常有两种一种是让你补全next数组另一种是给你模式串让你手算匹配过程。热词里正好有这个经典例子模式串 pabacaba求它的next数组。这里要特别提醒next数组的定义在不同教材里有两种版本——一种是next[i]表示“前缀中真前缀和真后缀的最大公共长度”另一种是更常见的“失配时跳转的位置”。这两种定义求解出来的数组会差一个偏移很多人在笔试里挂掉就是因为没先看清楚题目给的是哪种定义。拿abacaba举例如果采用常见的失配跳转定义next[i]表示模式串前i个字符组成的子串中最长相等真前缀和真后缀的长度那么计算过程是next[0] -1或0看具体约定next[1] 0next[2] 0前缀ab无相等前后缀next[3] 1前缀aba最长相等前后缀是a长度为1next[4] 2前缀abac最长相等前后缀是ab注意这里不是2吗让我们仔细算子串abac的前缀有a, ab, aba后缀有c, ac, bac没有相等的所以是0这里我一开始也差点算错abac里前缀a对应后缀c不等前缀ab对应后缀ac不等所以next[4]0next[5] 1前缀abaca前缀a对应后缀a相等长度1前缀ab对应后缀ca不等所以是1next[6] 2前缀abacab前缀ab对应后缀ab相等长度2next[7] 3前缀abacaba前缀aba对应后缀aba相等长度3这个计算过程虽然不复杂但考场上很容易因为粗心出错。我的建议是平时练习时把两种定义的next数组都练熟做题时先花十秒确认题目约定避免低级失误。KMP的时间复杂度是O(mn)这个也要能解释清楚——为什么朴素匹配会回溯而KMP通过next数组让主串指针永不回溯。2.3 图论与最短路径从Dijkstra到二分图匹配把适用条件刻在脑子里图论题目在试卷A里同样有出现但考察得不算特别深。Dijkstra算法堆优化的Dijkstra以及二分图匹配热词里提到的HK算法都在考察范围内。Dijkstra的核心是贪心策略但它要求图中不能有负权边。试卷里可能会出这么一道陷阱题给定一个含有负权边的图问Dijkstra为什么可能出错。答案不是因为它不能处理负权实际上负权边不会导致算法死循环只是可能得到错误的最短路径结果而是因为算法每次从优先队列中取出的“当前最小距离点”一旦确定就认为它已经达到最短路径了而负权边的存在可能在后期通过另一条路径更新这个点的距离导致前面贪心选择的正确性被破坏。这种情况下应该改用Bellman-Ford或SPFA。同理如果题目提到二分图匹配那么匈牙利算法和HK算法的适用场景也要清楚——HK算法通过BFS构建增广路径层级图再用DFS并行查找增广路径时间复杂度从O(VE)优化到O(E√V)适合数据规模较大的二分图匹配问题。关于图论我的建议是把Dijkstra、Floyd、Bellman-Ford、拓扑排序Kahn算法、以及最小生成树的Prim和Kruskal放在一起对比复习重点掌握它们的适用条件和复杂度差异而不是只看一种。2.4 动态规划与贪心不只是会写状态转移方程还要会证明贪心正确性动态规划和贪心算法是算法题的重头戏。试卷A中出现了跳跃游戏、区间调度这类问题它们都涉及“什么时候该用贪心什么时候该用动态规划”的判断。一个经典的区分方法是如果每一步的最优选择可以全局最优那么贪心往往是可行的如果子问题之间存在重叠且无法通过局部最优推导出全局最优那就必须用动态规划。比如跳跃游戏II求最少跳数到达末尾可以用贪心在O(n)时间内解决但如果你把它当作一个DP问题需要O(n²)的复杂度才能处理。这个区别在笔试中很关键因为同样的数据范围O(n²)可能就是无法通过的。在动态规划的题目中试卷A比较倾向于经典的背包问题、最长递增子序列LIS、最长公共子序列LCS等。这些题虽然经典但真正拉开差距的是状态定义和边界条件的处理。比如LIS问题很多人知道O(n²)的解法但笔试如果要考到O(n log n)的贪心二分解法就需要对“维护一个最小末尾元素数组”这个技巧非常熟悉。2.5 各类经典算法补充KMP、快速幂、PID…一起覆盖除了上述内容试卷A还顺带考了一些经典算法和工程算法覆盖面非常广。快速幂是这里面的常客它通过把指数二进制展开将时间复杂度从O(n)降到O(log n)在密码学、大数计算和取模运算中有广泛应用。笔试里会考快速幂的递归和迭代两种写法迭代版本在计算 a^b mod p 时能有效避免中间结果溢出是笔试手撕的推荐写法。PID控制器也出现在试卷中——虽然多数人觉得这是自动控制领域的内容但途虎的业务里确实有不少场景会用到类似的思想比如车辆维保设备的温度控制、胎压校准等。增量式PID和位置式PID的区别在于输出量是执行机构的增量还是绝对位置增量式PID因为不累加误差抗积分饱和能力更强也更安全。这类题目不太会要求你推导传递函数更多是考察对概念的理解和工程直觉。3. 机器学习与深度学习基础途虎不是考你刷榜而是考你会不会用3.1 经典机器学习算法KNN、聚类、集成学习一个不落试卷A中机器学习基础部分的题目难度大致相当于“机器学习入门一年内必须掌握”的水平。KNN、K-Means聚类、PCA降维、决策树与随机森林、逻辑回归、朴素贝叶斯等都有涉及。这里我要提醒一个高频考点KNN的三个核心要素——距离度量、K值选择、分类决策规则。热词里提到的“KNN算法的应用能力包括哪三个方面”其实就是这个。距离度量常用欧氏距离K值选择影响模型的偏差和方差K太小容易过拟合、K太大容易欠拟合分类决策规则通常用多数表决。还有一个容易被问到的点是KNN的“懒惰学习”特性——它没有显式的训练过程而是在预测时才计算样本之间的距离所以训练阶段的开销几乎为零但预测阶段的开销很大。聚类方面K-Means的初始中心点选择、K值的确定方法肘部法则、轮廓系数都是考点。还有一道题问到K-Means和GMM高斯混合模型的区别——K-Means是硬聚类每个样本只能归属一个簇GMM是软聚类输出的是每个样本属于各分布的概率。在业务中如果只是粗粒度分群K-Means就够了如果想做更精细的客户画像GMM或多层次聚类会更合适。集成学习方面随机森林和GBDT对比是经典题目。随机森林通过bagging降低方差GBDT通过boosting降低偏差两者在不同的数据场景下各有优势。随机森林的每一棵树可以并行训练GBDT则是串行训练的。这个话题在笔试中如果是简答题你最好能具体说明在什么业务场景下选择哪一种更合适——比如特征比较多且存在明显非线性关系时随机森林往往更稳健如果数据本身噪声较小、强调预测精度GBDT类模型如XGBoost、LightGBM通常表现更好。3.2 深度学习基础卷积、循环、注意力机制都会碰到深度学习部分的题目集中在CNN、RNN、注意力机制上。图像处理方面试卷A出现了一道关于图像锐化的题目考察拉普拉斯算子——这其实是从数字图像处理的角度切入深度学习。拉普拉斯算子是二阶微分算子可以突出图像中的灰度突变区域常被用于图像锐化。在深度学习中类似的操作被卷积神经网络中的边缘检测卷积核继承了下来。Sobel算子和拉普拉斯算子的区别在于Sobel是一阶微分、带方向性而拉普拉斯是各向同性的二阶微分对噪声更敏感。知道这些概念在不同章节之间的关联会让你在面对跨领域的题目时更从容。训练技巧方面题目涉及了梯度消失、学习率、参数初始化等内容。比如题目问深层网络训练时梯度消失的常见原因和解决方案选项可能有“使用ReLU激活函数”“引入BatchNorm”“使用残差结构”“换用SGD为Adam”。答案是前三个都是有效的措施Adam虽然能调整学习率但并不能从根本上解决梯度消失问题。Transformer方面自注意力机制Self-Attention的Q、K、V的含义是必考题。Q是查询向量K是键向量V是值向量注意力权重通过Q和K的点积计算再经过Softmax归一化得到。为什么要除以√d_k因为当维度较高时点积数值会比较大经过Softmax后梯度会变得很小除以根号维度可以缩放点积值让梯度更稳定。这个细节虽然小但经常出现在选择题里也容易在面试中被追问。3.3 排序检索与业务模型BM25和相关度算法如果你仔细看热词列表会注意到BM25算法也在里面。BM25是信息检索领域常用的相关度排序算法它在传统TF-IDF的基础上引入了词频饱和和文档长度归一化。在途虎的业务场景中BM25可以用于搜索“机油型号”“轮胎规格”等商品的候选召回排序。试卷A里有一道简答题就是关于商品搜索的——给出几个查询词让你比较它们在不同文档中的相关性得分本质上就是考察BM25的计算原理。这道题给我的启发很大途虎这类平台的算法笔试非常愿意把通用的算法模型放进自己的业务场景里考察。一方面这是为了确认你真的理解了算法而不是只会调用现成库另一方面也是在看你能不能把技术能力迁移到非典型的互联网场景中。4. 数学与优化类算法粒子群、模拟退火、卡尔曼滤波到底在考什么4.1 智能优化算法粒子群和模拟退火怎么选不少同学看到粒子群算法PSO和模拟退火SA出现在试卷里会很意外觉得这像是“运筹优化方向”才会考的内容。但放在途虎的场景里完全说得通——比如保养门店的选址、技师排班、以及物流路径规划都可能涉及组合优化问题。这类问题规模一旦变大精确算法如分支定界的求解时间会指数增长这时候就要借助启发式或元启发式算法。粒子群算法的核心是模拟鸟群觅食行为每个粒子在搜索空间中移动通过自身历史最优位置pbest和全局历史最优位置gbest来更新速度。它的优点是实现简单、参数少收敛速度快适合连续优化问题。模拟退火算法的思想来自金属退火过程以一定概率接受比当前解更差的解从而跳出局部最优。它更适合离散优化问题而且对初始解不太敏感。试卷里出了一道选型题某个调度问题是离散的、规模较大、且对实时性有要求选择哪种优化算法更合适正确思路是离散场景下粒子群需要做离散化改造不如模拟退火直接但如果追求速度遗传算法或粒子群的并行性更好。这种题没有绝对标准答案关键是你的理由要站得住脚。4.2 卡尔曼滤波从传感器融合到预测的通用工具卡尔曼滤波在试卷A里的出现同样令人意外但仔细想想又很合理。汽车后市场的数据非常多来自传感器和设备比如轮胎压力监测、车辆定位、保养设备的状态监控。这些传感器数据往往带有噪声卡尔曼滤波正是用来从带噪声的观测中估计系统真实状态的经典算法。卡尔曼滤波的核心是预测和更新两个步骤交替进行。预测阶段利用状态转移矩阵从上一时刻的状态推算出当前时刻的先验状态估计和先验误差协方差更新阶段用当前的观测值计算卡尔曼增益再对先验估计进行修正。卡尔曼增益本质上是在“预测误差”和“观测误差”之间做一个加权谁的误差小谁在最终估计中占的权重大。对于笔试备考我建议掌握一维卡尔曼滤波的完整推导过程包括状态方程、观测方程、预测和更新公式以及卡尔曼增益的物理含义。如果能手写一个一维的例子比如匀速运动物体的位置估计那么试卷中关于卡尔曼的题目基本都能应付。4.3 规则引擎与业务规则RETE算法可能是一道隐藏的送分题热词里提到了规则引擎Drools的RETE算法实现原理和事实匹配过程。这看起来像后端开发的考点但实际在途虎的业务中也有应用场景——比如促销规则、优惠券发放规则、售后审核规则等。规则数量一多逐个规则去匹配显然效率太低RETE算法的核心思想就是通过构建一个网络状结构把规则的条件部分拆分成多个节点让多个规则共享相同的模式匹配结果从而避免重复计算。试卷A中有一道选择题就涉及到大量规则的场景优化——它不直接点名RETE而是问“在一个规则数量庞大、事实频繁更新的业务系统中如何提升规则匹配效率”。如果你见过RETE算法就能联想到网络匹配、增量匹配这些关键词。这个考点提示我们算法笔试已经越来越不局限于纯算法题了工程算法和业务中间件里的算法同样值得关注。5. 业务场景题这才是试卷A真正拉开差距的地方试卷最后的业务场景题我记得至少有两大题分值占比比较高。和前面的知识型题目不同这些题没有唯一标准答案更看重解题思路和业务理解。一道题的大意是途虎养车平台有海量的车型数据和保养记录如何设计一套算法方案在用户输入车型信息后快速匹配出适配的机油、机滤等保养配件这类题其实就是“商品推荐/检索系统设计”的变体。我的答题思路是分三层第一层是数据清洗与标准化把不同品牌、不同车系的车型名称统一映射到标准车型库这步是整个系统的基础数据不对后面全白搭第二层是召回层用ES或基于BM25的文本检索配合一些过滤规则如发动机型号、排量、年款快速锁定候选配件集合第三层是排序层结合用户历史更换记录、配件销量、评价数据训练一个学习排序模型如LambdaMART或DeepFM来输出最终的配件推荐列表。另一道题则是关于库存预测的途虎在全国有大量门店和仓库不同车型的配件需求波动很大如何预测未来一段时间的配件需求量以指导备货这道题我的拆解思路是先做时序数据的预处理处理缺失值和异常值然后根据需求特性选择模型——如果是短期预测可以用ARIMA或者Prophet如果考虑节假日、促销活动、车型保有量等多维特征可以用LightGBM这类树模型如果数据量足够大并且需要捕捉复杂时序依赖可以考虑LSTM或Transformer类模型。此外要考虑冷启动问题比如新上市的车型没有历史销量数据这时候可能需要借鉴相似车型的销售曲线或者用聚类方法做跨车型的知识迁移。业务场景题的得分点是逻辑清晰、考虑全面、并且能体现你对实际工程问题的理解。不需要写出非常复杂的公式或模型结构但一定要有层次感从数据到模型到评估到上线完整地描述出来。6. 题型策略与备考建议按这套打法准备能覆盖八成以上的考点6.1 考前复习优先级我在复盘这套试卷A的时候发现它的考点分布其实是有规律的。如果按投入产出比排序复习优先级应该是这样第一优先级数据结构与算法高频题包括排序、字符串KMP、图论Dijkstra、动态规划、贪心。这些是确定性最高的考点也是笔试中的“上分题”。第二优先级机器学习经典算法包括KNN、K-Means、逻辑回归、决策树/随机森林/GBDT、PCA等。重点不是会调库而是能说明白原理和适用场景。第三优先级深度学习基础包括CNN、RNN、注意力机制、激活函数、损失函数、优化器、正则化手段。第四优先级数学与优化类包括粒子群、模拟退火、卡尔曼滤波、PID等这些在途虎的试卷中出现概率高但其他公司未必会考可以作为一个特定的加分项。第五优先级业务方案设计题这类题没有固定考纲但可以通过平时多思考“技术如何落地到业务”来积累经验。6.2 手撕代码题的几个习惯试卷A中代码题的数量不算多但给的分值高。我看了一下自己的答题记录总结出几个容易拉分的行为习惯第一先写伪代码再写实现。不要一上来就在答题框里敲代码容易写着写着把自己绕进去。先在草稿纸上画出核心逻辑和数据流再动手。第二边界情况要主动考虑。比如KMP模式串为空、链表长度为1、图没有边、数组元素全是负数等。很多人的代码在常规测试用例上没问题但边界用例一跑就崩这是笔试中最惋惜的失分点。第三复杂度分析要写清楚。不只写代码还要在最后注明时间复杂度和空间复杂度。这不仅是为了得分也能让面试官看到你的工程意识。6.3 时间分配的经验值我个人比较推荐的时间分配方案是这样的总时长120分钟的话选择题和填空题控制在30到40分钟不管会不会都先选出答案——因为这类题填错了不倒扣分蒙一个总比空着强代码题控制在60到70分钟把两道题打通开放的业务题留20到30分钟写清楚框架和关键流程即可。这里要特别强调一点遇到不会的选择题千万不要死磕。我身边真的有同学因为一道粒子群算法的选择题纠结了十来分钟结果后面代码题没时间写完整。正确的策略是先把能拿的分都拿到再回头研究不确定的题。6.4 针对途虎这类公司算法的通用备战思路如果你准备投的不是途虎而是类似的汽车后市场、本地生活、O2O平台那么这套卷子的备战思路同样适用。一是要学会“背业务”。提前了解目标公司的核心业务模式、主要算法应用场景。比如途虎的核心是“线上预约线下门店服务”那么订单分配、技师调度、配件供应链预测、商品推荐就是核心算法场景。面试和笔试前把这些业务场景想一遍遇到开放题就有话可说。二是要学会“一题多解”。比如同样一个问题能给出精确解、启发式解和机器学习解三种方案并且能分析各自适用条件和优缺点这种能力在业务题中尤为加分。三是要适当地补充工程领域的基础知识。从这次试卷A来看像RETE算法、BM25、PID这类“非典型算法题”能筛掉不少只刷LeetCode的候选人。有一句话是校招算法笔试已经进入“全面战争”时代只背模板已经不够了知识面越宽胜算越大。7. 我个人踩过的坑和这套题的备考扩展最后说几个我实际做题时的血泪教训希望后面备考的同学能避开。第一个坑是“眼高手低”。我花了很多时间在准备深度学习模型的大题上结果试卷里考得更多的反而是经典的机器学习算法基础和一些冷门但有用的优化算法。吃透周志华老师的《机器学习》前几章和吴恩达的课程讲义比刷十个原理解释视频更有用。第二个坑是“计算题不能只写思路”。试卷里有几道题需要实际计算出结果比如KMP的next数组、堆排序的建堆过程、粒子群算法的迭代一步。这些题我看到思路是对的但粗心导致算错了。考场上一定要在草稿纸上把每一步算清楚不要依赖心算。第三个坑是“开放题写太短”。业务场景题很看重你思维的层次感。如果只写一两句话哪怕结论正确分数也不会高。我的经验是采用“总-分-总”结构先给出整体方案框架然后分模块说明每个环节的关键算法和数据流最后补充评估指标和可能的优化方向。第四个建议是关于考后复盘。笔试结束后无论结果如何我建议立刻把整套卷子的考点记录下来对照解析把错题重做一遍。这套试卷A的价值不仅仅是一次考核更是一个难得的知识地图——它清楚地告诉你途虎乃至同类公司的算法团队在实际工作中关注什么、使用什么。把这张地图吃透比多刷十道LeetCode题更有价值。如果你能把我上面提到的知识点都过一遍并且练熟两三个经典的业务场景方案检索排序、库存预测、供需匹配那么再遇到类似途虎秋招算法笔试试卷A的风格你应该不仅能做对题还能做出让面试官眼前一亮的感觉。