拓冰建站拓冰建站
首页 / 资讯中心 / 正文

2023联想算法开发岗笔试复盘:题型解析与编程题思路

2023年秋招季算法岗的竞争烈度不用我多说。联想算法开发岗这场笔试题型不算偏门但覆盖面相当广既有数据结构与算法的基础题也有机器学习、深度学习、甚至工程算法相关的考察点整体风格务实侧重基础扎实度和工程思维。我考完之后花了不少时间做复盘今天索性把完整的经验整理出来包括题型构成、考点分布、编程题的完整破题过程以及那些只有真正上过考场才会踩到的坑给正在准备算法岗笔试的朋友做一个参考。笔试题目的具体细节我不可能一字不差地复述但考察的知识点、难度梯度、出题偏好这些是可以提炼出来的。这篇文章适合两类人看一类是明年准备冲大厂算法岗的应届生另一类是想转岗算法方向的工程师希望通过一场真实笔试的复盘来判断自己缺在哪块。1. 2023联想算法开发岗笔试题型构成与现场节奏复盘1.1 笔试的整体框架选择、编程和简答的配比逻辑联想这场算法开发岗笔试采用的是在线笔试平台整体时长大概在90分钟到120分钟这个区间题量对于认真准备过的同学来说不算夸张但绝对需要合理规划时间。题型上主要分成三块选择题、编程题和简答题。选择题占了比较大的比重内容覆盖数据结构、算法理论、机器学习基础、深度学习概念等。这部分考察的是知识面的广度尤其是一些概念性、定义性的东西比如KMP算法中next数组的具体计算、某种排序算法的稳定性、哈希冲突的处理方式等。这类题目的特点是知道就是知道不知道很难蒙对。编程题一般是两到三道难度有梯度。第一道通常偏简单考察基本的编码能力和对常见数据结构的运用比如数组、哈希表、字符串的处理第二道开始上强度会涉及到贪心、动态规划、图论或者二分答案这些经典算法。部分场次可能还有一道难度较高的压轴题用来筛选真正有竞赛功底或者算法思维特别突出的候选人。简答题是很多同学容易忽略的部分。它考的往往不是你能不能写出代码而是能不能把算法原理讲清楚比如让你描述粒子群算法的寻优过程或者解释一下模拟退火算法中温度参数的作用。这类题考察的是表达能力和理解的深度背八股是能应付一部分但没真正理解的话一旦题目换个问法就容易露馅。1.2 我在现场的时间分配策略我个人的习惯是拿到卷子先花两分钟快速浏览全卷大致判断每道题的难度和分值。选择题部分我给自己限定了30分钟左右因为选择题虽然分值不高但数量多如果每道题都纠结会严重挤压后面编程题的时间。编程题我会先做第一道简单题确保稳拿这个分然后再去啃第二道。第二道题如果看了三四分钟还没有清晰的思路我会先在草稿纸上写写小规模样例从暴力解法开始推看能不能找到优化的方向。实在卡住了就先把简单的暴力版本写上能拿部分分也好过空着交白卷。简答题我放在最后处理因为这类题只要时间够总能写出一些东西。但要注意控制篇幅不要在一道简答题上洋洋洒洒写一大堆导致其他题目没有时间。1.3 对整体难度的主观评价从我个人感受来说2023年联想这场算法开发岗笔试的难度整体属于中等偏上没有特别刁钻的偏题怪题但考察范围非常广更看重你是否真正理解了算法背后的原理而不只是背了几个模板。选择题里有一些很细的知识点比如KMP算法中next数组的具体定义、堆排序为什么是不稳定的、某些算法的时间复杂度推导这些在LeetCode刷题时未必会碰到但在笔试中就是拉分项。编程题的第一道属于热身题第二道开始就需要一定的算法设计能力了。整体来说这场笔试的筛选效率很高基础不扎实的同学会明显感觉到吃力。2. 热搜词里的考点地图算法岗到底在考什么2.1 数据结构与基础算法KMP、排序、堆这些老面孔联想算法岗笔试的选择题里数据结构与基础算法占了很大的比重。链表、栈、队列、二叉树、堆、哈希表这些都是常规操作但考察方式往往不是直接让你背概念而是会结合具体的算法场景。举一个我印象很深的例子热搜词里有这样一条“在KMP算法中对于模式串pabacaba其next数组”。这种题考的就是对next数组定义的精准理解不是会写KMP就能答对的。很多同学刷题时直接调库或者背模板对next数组到底存的是什么、怎么手工推导根本不熟遇到这类选择题就会卡壳。KMP的next数组本质上记录的是模式串中每个位置之前的子串的最长相等前后缀长度。以abacaba为例真正理解它的人可以快速手动推导而不理解的人只能瞎猜。这提醒我们复习时不能只追求能AC题目还要能手工演算经典算法的过程。排序算法也是选择题的常客。稳定排序有哪些不稳定排序有哪些快速排序在最坏情况下的时间复杂度是多少堆排序为什么不稳定归并排序的空间复杂度这些基础问题几乎是为算法岗量身定制的筛选器。面试官不需要你有多炫技的解法但最基础的知识必须烂熟于心。2.2 机器学习与深度学习基础算法开发岗的隐藏门槛算法开发岗和纯后端开发岗不一样的地方在于它要求候选人具备一定的机器学习和深度学习基础。联想这场笔试里这一块的主要考察方式还是以选择题和简答题为主。选择题里会考察一些经典算法的基本原理比如KNN分类的决策依据是什么、K-Means聚类的收敛条件、决策树的分裂准则、梯度下降和随机梯度下降的区别等。这些属于机器学习入门课程的核心内容难度不高但范围广。深度学习部分的考察相对浅一些主要涉及CNN、RNN的基本结构反向传播的直觉理解常见激活函数ReLU、Sigmoid、Tanh的特点和适用场景过拟合的解决方法等。偶尔也会出现一些偏应用的题目比如让你判断音频重采样算法在信号处理中的作用或者图像锐化中拉普拉斯算子、Sobel算子的作用。这些内容看起来有点偏但对于算法开发岗来说图像算法、信号处理算法本来就是这个岗位日常工作的一部分所以考到也不算超纲。简答题里如果出现机器学习相关的内容往往要求你比较两种算法或者解释某种算法的关键步骤。比如让你简述决策树和随机森林的区别或者解释K-Means算法选择初始质心的不同策略对结果的影响。这类题核心考的是你是否真正理解算法的来龙去脉而不是只会调sklearn的包。2.3 经典优化算法与工程算法从贪心到启发式搜索除了常规的排序、查找、图论算法联想这场笔试还对优化算法展现了一定的兴趣。粒子群算法、模拟退火算法这些启发式算法在热搜词里出现频率很高说明这段时间确实有很多人在搜索准备这类考点。这类算法在算法开发岗笔试里通常不会让你手写完整的实现而是通过选择题或者简答题考察你是否理解它们的基本流程和关键参数。比如粒子群算法中每个粒子的位置更新公式中惯性权重和学习因子的作用是什么模拟退火算法中温度较高时接受差解的概率更大这个Metropolis准则的目的是什么。这些问题考察的是对算法灵魂的理解而不是背公式。工程算法方面卡尔曼滤波、PID算法、MPPT算法、FOC算法这些也偶尔会出现。这跟联想的业务结构有关作为一家硬件和智能设备厂商它们在很多业务线里面确实需要处理信号控制、状态估计这类问题。如果你投递的是算法开发岗这些工程算法的基本概念至少要有所了解不需要会完整推导卡尔曼滤波的五个公式但至少要能说出卡尔曼滤波解决的是什么问题、它的输入输出是什么这套系统的基本流程是怎样的。2.4 考点频率与准备优先级速查表如果你准备时间有限我根据自己的实战经验和对身边的同学调研整理了一张考点优先级表可以帮你快速判断复习精力应该花在哪里。考点类别具体内容出现频率准备建议数据结构与基础算法KMP、排序、二叉树、堆、哈希极高必须能手写关键代码并手工推导next数组、稳定排序等细节经典算法贪心、DP、二分、图论Dijkstra、快速幂高刷题主战场至少覆盖剑指offer和LeetCode热题100机器学习基础KNN、K-Means、决策树、梯度下降中高理解原理准备简答题的算法对比类问题深度学习基础CNN、RNN、激活函数、过拟合中等掌握基本概念和典型网络结构启发式优化算法粒子群、模拟退火、遗传算法中等理解流程和参数含义不需要手写代码工程算法卡尔曼滤波、PID、重采样较低了解概念和应用场景即可数字图像算法Sobel、拉普拉斯算子低了解基本用途和原理这张表不是我凭空拍脑袋得出的而是结合了热搜词热度、笔试复盘和交流群里同学们的反馈综合出来的。你可以看到最需要花时间的仍然是数据结构与经典算法这是笔试的根本盘刷题量上去了基本盘就稳了。3. 编程题实战复盘从读题到AC的完整思路3.1 一道典型的编程题是怎么设计的编程题的设计逻辑通常遵循“读题-分析-实现-验证”的流程。一道好的笔试题不会考察你某个冷门的API函数而是会通过一个具体的场景考察你对数据结构和算法核心思想的理解。拿联想这场笔试的编程题来说第一道题通常偏应用型比如给你一个数组让你统计某种条件下符合要求的元素个数用哈希表加一次遍历就能解决。这类题考察的是最基础的工程编码能力确保你的代码整洁规范能正确处理边界条件。第二道题开始才真正考察算法设计能力。这类题往往是经典题型的变体比如基于贪心思想的任务调度问题、基于动态规划的背包问题、基于图论的路径规划问题。你需要快速判断出题目的考点然后选择正确的算法体系去解决。这里有一个很关键的经验不要一上来就想着用复杂的算法。很多题的最优解其实都是“排序贪心”的组合但很多同学一看到题目就自动往动态规划上想结果绕了远路还写不对。3.2 一道排序加贪心题的完整破题过程我来构造一道典型的联想风格笔试编程题演示一下完整的破题流程。题目大意是有一个任务列表每个任务有一个截止时间和一个收益值每个任务耗时为一个单位时间请你选择最优的执行顺序使得总收益最大。这种题其实就是经典的任务调度问题核心解法是贪心加优先队列。我当时的思考路径是这样的第一步先把任务按截止时间从小到大排序。为什么按截止时间排因为越早截止的任务越应该优先被考虑如果先做晚截止的早截止的任务可能就来不及做了。第二步遍历每个任务用一个小顶堆维护当前已选任务中收益最小的那个。每来一个新任务就把它的收益加入总收益、入堆如果当前已选任务数量大于当前任务的截止时间说明排不下了就把堆顶收益最小的任务踢出去。第三步遍历结束后累加的总收益就是答案。这个解法的核心逻辑是在每一个时间点我们都尽量选择收益最高且能在截止时间前完成的任务组合。用优先队列来动态维护“当前已选任务中收益最低的”每次要淘汰时就淘汰它时间复杂度是O(n log n)对于笔试的常规数据范围完全够用。写代码时思路就会很清晰import heapq def max_profit(tasks): # tasks: list of (deadline, profit) tasks.sort() pq [] total 0 for deadline, profit in tasks: heapq.heappush(pq, profit) total profit if len(pq) deadline: total - heapq.heappop(pq) return total这道题用到的知识非常纯粹排序、贪心、堆。但它考察的恰恰是你能不能看穿问题的本质判断出该用贪心还是动态规划以及能不能想到用优先队列来维护一个动态集合。3.3 一道动态规划题的状态设计与边界处理如果编程题里出现了动态规划那必然是整个笔试的重头戏。动态规划题最容易翻车的不是状态转移方程本身而是初始化条件和边界情况的处理。以我复盘时遇到的一道类似题目为例给定一个数组每个位置代表你在这个位置可以跳跃的最远距离问能否跳到最后一个位置。这道题有贪心的解法但如果出题人加一个条件——要求你输出跳到终点所需的最少跳跃次数——那就必须用动态规划或者更巧妙的贪心策略了。这类题目真正的难点在于定义清楚dp[i]的含义是“跳到位置i的最少跳跃次数”还是“从位置i跳到终点所需的最少次数”定义不同转移方程的写法完全不同。一旦定义错了后面所有代码都会跑偏。笔试时我的建议是遇到DP题先不要急着写代码先在草稿纸上把状态定义、转移方程、初始化条件和遍历顺序这四要素完整推一遍再开始写代码。很多同学觉得这四步浪费时间直接上来就写结果写到一半发现循环顺序不对或者初始化条件写错了整个代码推倒重来反而更浪费时间。3.4 笔试代码风格的几个隐形加分项编程题不只是看答案对不对代码风格也会影响整体印象。虽然在线判题系统只看测试用例通过率但笔试之后如果进入面试环节面试官是可能回看你笔试代码的所以代码整洁度同样重要。我总结的几条实践经验变量命名要见名知意不要全部用a、b、c这种无意义的名字关键的算法步骤要有简单的注释不用多核心逻辑处写上一两行能大大提升代码可读性要主动处理边界条件比如数组为空、输入长度达到上限等情况复杂度打印或者调试用的临时代码要删干净。还有一点笔试环境通常只提供基础的代码编辑器没有本地IDE那么强的补全和调试能力。这就意味着你平时刷题时就要习惯不依赖IDE的自动补全常用的数据结构操作要能直接手写出来比如Python的collections.deque、heapq、defaultdict这些库的用法要熟练到不用查文档。4. 笔试现场容易翻车的细节我的经验教训清单4.1 环境与输入输出最冤的失分点笔试踩坑最冤的不是不会做题而是从输入输出这个环节就开始出问题。在线笔试平台通常有两种输入输出模式一种是类似力扣的核心代码模式你只需要实现函数测试用例的读取和结果输出平台已经帮你处理好了另一种是ACM模式需要你自己处理输入和输出的格式。联想这场用的是哪种模式我在备考时专门确认过但很多第一次参加线上笔试的同学容易在这里翻车。如果是ACM模式你需要非常熟悉input()和sys.stdin的用法尤其是多行输入、空行处理、字符串切分、整数转换这些基础操作平时一定要练熟。我见过最可惜的例子是一个算法能力不错的同学因为不熟悉在线IDE的缩进设置导致Python代码在粘贴后缩进全部错乱报了语法错误却迟迟找不到原因白白浪费了二十分钟。所以考前一定要用笔试平台提供的模拟环境练习一次熟悉它的编辑器和提交方式这种准备看起来琐碎但能实实在在帮你稳住心态。4.2 选择题里的理论陷阱next数组和排序稳定性选择题里面最容易出幺蛾子的是那种“你觉得你懂但其实没完全懂”的知识点。KMP算法的next数组就是这样因为平时刷题直接调字符串匹配函数真正手推next数组的机会并不多。但恰恰是这种知识盲区最容易成为笔试区分的点。我来演示一下next数组的手推过程。以模式串pabacaba为例next数组的定义是对于模式串的每个位置inext[i]表示模式串前i个字符组成的子串中最长相等前后缀的长度为了避免和当前位置重合通常要整体右移一位或者从-1开始计数不同教材的定义略有差异这也是为什么很多人看着答案都对不上。按照常见的考试定义以模式串p abacaba我们计算每个位置i之前不含i的子串的最长相等前后缀长度i0前面没有字符next[0]取-1或0取决于定义i1子串为a最长相等前后缀长度为0i2子串为ab最长相等前后缀长度为0i3子串为aba前缀a等于后缀a长度为1i4子串为abac前缀a不等于后缀c长度为0i5子串为abaca前缀a等于后缀a长度为1i6子串为abacab前缀ab等于后缀ab长度为2。如果你只是背了代码模板而没有真正推导过这个过程考场上看到这道题会非常懵。所以我的建议是把这种经典算法的手推过程全部练习一遍特别是KMP、快速幂、归并排序、Dijkstra这些有具体计算流程的算法能在纸上演算才能证明你的理解是真的。类似的理论陷阱还有哪些排序算法是稳定的哪些不稳定。归并排序、冒泡排序、插入排序是稳定的堆排序、快速排序、选择排序是不稳定的。这里的稳定性指的是相等元素的相对位置是否保持不变如果你不理解为什么堆排序不稳定建议手动模拟一次堆排序的过程感受一下。4.3 时间分配失控一道题卡住之后的止损方案编程题最让人头疼的情况是第二道题想了二十分钟还没有思路这时候心态很容易崩。我自己经历过的最大教训就是不要在一道题上死磕超过十五分钟超过这个时间还没有明确思路就应该切换策略。具体来说我给自己定的止损规则是先花三分钟读题和确认数据范围再花十分钟思考和设计算法。如果这十三分钟过去了还是没思路就先写一个暴力解法保证能拿到部分测试用例的分数。在ACM式判题中部分通过是能给分的好过一道题交了白卷。暴力解法能帮你拿到保底分同时也能帮你梳理题目逻辑。很多时候在暴力解的基础上调试几组样例反而能发现优化的切入点重新把正确解法写出来。笔试的判分系统通常是按测试用例分组给分能过简单用例也是实打实的分数。4.4 简答题的表达写不深不如写不清简答题常常被低估但这恰恰是基础扎实的候选人和只会刷题的候选人拉开差距的地方。很多同学写简答题喜欢堆砌术语写了满满一页但仔细看根本没有解释清楚原理。比如问你“简述粒子群算法的寻优流程”你要做的不是把公式全部抄一遍而是用清晰的逻辑表达串起完整的算法流程。我当时总结的一个回答框架是应用场景、核心思想、关键步骤、参数作用、优缺点。按照这个顺序来组织答案即使某些细节记不太牢至少整个答案的逻辑是完整的得分率会高很多。好的简答题答案应该是让面试官没有阅读障碍的。用词准确步骤清晰能体现出你真正理解了算法而不是在背课本。如果让你用一句话解释“模拟退火算法为什么能跳出局部最优解”你只需要抓住“以一定概率接受更差的解”这个关键点就够了而不是把整个算法的伪代码默写一遍。5. 复盘之后算法开发岗笔试的复习优先级5.1 按性价比排序的复习路线笔试复盘之后最重要的事情是整理出一条清晰高效的复习路线而不是继续无头苍蝇式地刷题。我根据自己的经验把准备优先级排了一个序供你参考。第一优先级是数据结构与经典算法。这个范围包括数组、链表、栈、队列、哈希表、二叉树、堆、排序算法、二分查找、双指针、贪心、动态规划、DFS、BFS、图论基础。这是笔试的根本盘决定了你能不能拿到基本分。刷题量上来之后关键是要做好题型归纳比如“看到题目中出现最大值最小值且满足单调性就要想到二分答案”“看到最优决策问题先考虑贪心再考虑DP”。第二优先级是机器学习与深度学习基础。因为算法开发岗本质上还是要做AI相关业务这部分基本概念必须掌握。推荐把西瓜书前几章和深度学习入门教材过一遍重点理解KNN、K-Means、决策树、贝叶斯分类器、梯度下降、反向传播、CNN基本结构、过拟合与正则化这些内容。第三优先级是工程算法和启发式算法。这部分内容多而杂复习成本相对高但单独考察的频率没有前两类高。建议以了解为主搞清楚每个算法是干什么的、核心流程是什么、有哪些关键参数不必深入推导数学细节。卡尔曼滤波、粒子群算法、模拟退火、PID控制在算法岗笔试里经常以概念题的形式出现理解到能讲的清楚的程度就可以了。5.2 以题带知识点一种积累式刷题法笔试准备阶段最忌讳的是漫无目的地刷题今天刷一道链表明天刷一道动态规划题目之间没有关联知识点也无法形成体系。我自己的方法是按照“场景”来刷题把同一类考点的题目放在一起集中攻克。比如贪心算法这个场景我可以一口气做十道贪心题做完之后总结贪心题常见的套路有哪些什么情况下能用贪心什么情况下贪心是错的需要换成动态规划这种“以题带知识点”的方式比单纯追求刷题数量要高效得多。复盘联想这场笔试之后我觉得还有一个很有价值的做法把每道做错的题按知识点归类每周回顾一次错题本。笔试前一周看错题本的价值远大于再刷十道新题因为人最容易在同一个坑里反复摔倒错题本的作用就是帮你把这些坑系统地填平。5.3 从笔试倒推算法岗位的能力模型最后想说一点笔试不只是面试官考察你的手段也是你了解目标岗位的一个窗口。通过联想算法开发岗的笔试题目你能大致判断出这个岗位日常工作中需要用到的技术栈。从题型构成来看这个岗位所需要的核心能力是扎实的算法基础和快速的问题建模能力同时需要你对机器学习、深度学习算法有完整的基本认知并且对图像算法、信号处理、控制算法等工程领域有所涉及。这意味着日常工作中你可能既要写业务代码处理数据也要负责某个模型的部署优化甚至需要和硬件团队协作解决设备端的算法问题。所以不要只把笔试当作一次考试来应对它其实是你了解岗位、审视自己能力短板的绝佳机会。笔试中暴露出来的问题比任何所谓的“面经”都更真实、更有针对性。整场笔试复盘下来我最深的体会是算法岗笔试考察的不是你掌握了多少炫技的算法而是你能否在有限的时间内用最朴素的逻辑去解决一个工程问题。刷题不是目的通过刷题把基础算法内化成自己的思维习惯才是最终目的。准备笔试的过程虽然辛苦但当你回头复盘时会发现这段时间对算法思维的打磨在后续的面试和实际工作中都会持续受益。
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门