十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

联想2025秋招算法笔试复盘:从KMP到Dijkstra的核心考点拆解

联想2025秋招算法笔试复盘:从KMP到Dijkstra的核心考点拆解 先说明一句我严重怀疑联想这套笔试是从面试题库里随机抽的不同岗位、批次的试卷差异很大但题目类型确实高度集中。这篇复盘是我把2025届秋招联想算法编程题的公开面经、讨论帖和自己参加笔试时留存的题目汇总到一起整理出的一套核心考点拆解。如果你正打算投联想的算法岗或者软开岗这篇至少能帮你把大方向摸清楚。1. 从笔试复盘看联想算法题的考察逻辑1.1 联想算法笔试的典型结构先说说整体印象。联想2025届秋招的算法笔试时长大概在90到120分钟之间题量一般是三道编程题加不定项选择。编程题部分难度梯度拉得比较明显第一题基本是送分题属于你只要认真准备了就会做的程度第二题开始考察实际建模能力第三题比较考验综合运用和复杂度优化能力。这里需要提醒一下联想的笔试平台比较常规不是那种奇葩的在线判题系统支持常见的编程语言C、Java、Python都可以。但有一个坑部分岗位的试卷里会混入硬件相关的逻辑题比如寄存器操作、位运算、字符串解析这种跟你投递的部门业务方向有关。我投的是算法岗遇到了不少字符串处理和模拟题而这正好和热搜词里出现的大量KMP相关词汇对上了。1.2 热搜词汇背后透露的命题信号从这组热搜词能看出几个重要信号联想笔试的题目并不会追逐特别刁钻的竞赛算法而是很看重数据结构基本功、字符串处理、图论基础搜索、动态规划模型这几大类。热搜词里反复出现的“KMP算法 next数组 abacaba”、“排序算法”、“堆排序”、“Dijkstra算法”、“二分图 HK算法”等等其实就是历年题目的高频标签。换句话说联想不是要招竞赛选手而是想招能用算法解决实际工程问题的人。这一点从命题风格上能很明显地感觉出来题干通常不会直接说“请实现KMP”而是给你一个具体的字符串匹配场景或数据解析场景让你自己意识到该用哪个算法。2. 字符串类题目的真实考法从KMP到状态机2.1 字符串匹配永远是第一梯队重点字符串处理在联想笔试里出现频率极高基本是必考题。热搜词里那条“在KMP算法中对于模式串p abacaba其next数组是多少”基本上就是原题级别的讨论。很多人看到这题会觉得简单但实际笔试里真的有不少人栽在next数组的定义上。先说清楚一个最常见的混淆点有些教材里next[i]表示的是“当第i位失配时模式串应该跳转到哪个位置”有些教材则定义为“以i结尾的最长相同前后缀长度”。这两种定义算出来的数组数值不一样但本质是等价的。联想的题目通常会给明确说明但如果你没注意审题直接用习惯的定义去写很容易错位。以pabacaba为例按“失配跳转位置”这种常见定义来计算next[0] -1因为第0位失配时只能回到开头next[1] 0因为a没有真前后缀next[2] 0因为ab没有相同前后缀next[3] 1因为aba有前缀a和后缀a相同next[4] 1因为abac的最长公共前后缀还是anext[5] 2因为abaca 有前缀ab和后缀ca不对这里要仔细算。等等我自己写太快容易错笔试时你也会遇到这种情况。建议在草稿纸上把每个前缀列出来前缀0: - next -1前缀1: a - 无真前后缀 - 0前缀2: ab - 无 - 0前缀3: aba - 最长相同前后缀是a - 1前缀4: abac - 无注意a和c不匹配 - 0前缀5: abaca - 最长相同前后缀是a - 1前缀6: abacab - 最长相同前后缀是ab - 2前缀7: abacaba - 最长相同前后缀是aba - 3所以按照“最长相同前后缀长度”定义next数组是[-1,0,0,1,0,1,2,3]或[0,0,1,0,1,2,3]。这个计算过程就是笔试的核心考察点不仅要求你记住代码模板还要求你能手动推演。如果你能熟练地在3分钟内手算出这类数组那你笔试时就会从容很多。2.2 字符串高频变体题循环移位、重复子串、通配符匹配联想笔试里的字符串题除了直接考KMP更喜欢做一些变体包装。比如判断一个字符串是否能由某个子串重复多次构成、在字符串中查找第一个唯一字符、最长回文子串、字符串循环移位包含判断等。这里我特别想提一个容易被忽略的题给定两个字符串A和B判断A循环移位后是否能包含B。最经典的做法是把A叠加成AA然后用KMP或直接调用库函数检查B是否为AA的子串。这类题目看起来不难但如果你没想到“AA包含了所有循环移位结果”这个性质就会想着真去模拟移位复杂度就上去了。另一个高频点是字符串与状态机结合。比如处理类似“请解析一段日志文本提取其中的IP地址和时间戳”这种题通常会用正则表达式或有限状态机。联想笔试允许使用Python的re库但需要注意平台上Python版本可能比较老且某些匹配模式下性能会很差。我建议基础题直接用find、split等常规操作别一上来就正则。3. 数据结构是重头戏堆、并查集和经典排序3.1 排序算法不只是冒泡联想怎么考排序热搜词里“排序算法”、“数据结构排序算法”、“堆排序算法”反复出现说明排序是联想笔试的常客。但真正的笔试不会让你写冒泡排序除非是第一题的简单场景。联想的排序题一般会以“求第K大元素”、“数据流中位数”、“合并K个有序链表”等形式出现表面是排序实际是让你选择合适的数据结构。“找第K大”最经典的解法是快速选择平均复杂度O(n)但最坏会退化到O(n^2)。稳妥方案是建一个大小为K的最小堆遍历一遍数据堆顶就是第K大的元素复杂度O(n log K)。用Python的话heapq模块几行就能写完import heapq def find_kth_largest(nums, k): heap nums[:k] heapq.heapify(heap) for x in nums[k:]: if x heap[0]: heapq.heapreplace(heap, x) return heap[0]代码本身不难但笔试时很容易错在边界处理上比如nums长度正好等于k或者k的取值等于1。这种细节扣分很可惜。3.2 堆排序的两种考法手写实现和复杂度分析有一类比较狠的题目会直接让你手写堆排序。如果你在IDE里用了Python的heapq那很容易但如果你必须手写down操作就要格外小心。堆排序的核心是建堆和调整两个过程def heapify(arr, n, i): largest i left 2 * i 1 right 2 * i 2 if left n and arr[left] arr[largest]: largest left if right n and arr[right] arr[largest]: largest right if largest ! i: arr[i], arr[largest] arr[largest], arr[i] heapify(arr, n, largest) def heap_sort(arr): n len(arr) for i in range(n // 2 - 1, -1, -1): heapify(arr, n, i) for i in range(n - 1, 0, -1): arr[i], arr[0] arr[0], arr[i] heapify(arr, i, 0)建堆的复杂度是O(n)而不是O(n log n)这个点很多文章会讲但笔试选择题里真的会考。第二种考法是“给你一个几乎排好序的数组每个元素离它最终位置的距离不超过K用什么排序最快”答案是大小为K1的堆来做滑动窗口排序复杂度O(n log K)。这类题如果你没接触过堆的应用场景很容易答错。3.3 并查集连通性问题的万能工具联想笔试里图论题不一定考复杂的最短路很多时候是“判断两个节点是否连通”、“岛屿数量”、“朋友圈数量”这类问题。这些题的最佳解法就是并查集。并查集的模板必须写得滚瓜烂熟尤其是路径压缩和按秩合并两个优化。路径压缩能够把查找复杂度压到近乎O(1)但笔试时很多人会忘记在find里做递归压缩def find(x): if parent[x] ! x: parent[x] find(parent[x]) return parent[x]还有一个容易出错的地方合并时要注意把“秩”小的合并到“秩”大的下面否则树会退化成链。联想笔试的题量不算小如果并查集模板还靠现场回忆那会浪费很多时间。4. 图论题联想笔试中的高频算法模板4.1 Dijkstra算法与最短路径边界条件和堆优化缺一不可图论在联想的笔试题里是常客尤其是有向带权图的最短路径问题。热搜词里的“Dijkstra算法”几乎每年都会出现。考察形式一般有两种一是直接考最短路径计算二是考带限制条件的最短路径比如“最多经过K次中转”或“路径经过的边权满足某种条件”。Dijkstra的朴素实现是O(V^2)在笔试平台数据量大时会产生超时。所以一定要掌握堆优化版本import heapq def dijkstra(graph, start): n len(graph) dist [float(inf)] * n dist[start] 0 pq [(0, start)] while pq: d, u heapq.heappop(pq) if d dist[u]: continue for v, w in graph[u]: if dist[u] w dist[v]: dist[v] dist[u] w heapq.heappush(pq, (dist[v], v)) return dist这个模板里有一个小坑当从优先队列里弹出节点时必须判断d是否大于dist[u]如果是就直接跳过。这个“懒惰删除”技巧很多第一次写的人会漏掉导致正确性出问题但很难查出来。如果题目有负权边那Dijkstra就不能用了得换SPFA或Bellman-Ford。联想笔试很少考负权边但选择题中可能问到相关概念所以至少要知道区分。4.2 二分图最大匹配HK算法与匈牙利算法的取舍热搜词里出现了“二分图 HK算法”这个点比较偏但既然出现了就要重视。联想的算法题偶尔会把二分图匹配包装成任务分配或日程排期问题。比如“有n个任务和m个人每个人能完成其中某些任务求最多能完成多少个任务”这就是标准的二分图最大匹配。常见的解法是匈牙利算法DFS版本的实现大概三十行bool dfs(int u) { for (int v : adj[u]) { if (vis[v]) continue; vis[v] true; if (match[v] -1 || dfs(match[v])) { match[v] u; return true; } } return false; }匈牙利算法复杂度O(VE)对于中等规模数据够用。但如果你遇到数据量较大的题目就要考虑HK算法Hopcroft-Karp它通过BFS分层和DFS增广的方式把复杂度降到O(E sqrt(V))。两者的区别在于HK算法不是每次只找一个增广路而是找多条不相交的最短增广路效率更高。我在实际笔试中遇到过一道类似“课程安排冲突”的题当时用的匈牙利算法顺利通过了。但如果数据范围再大一点可能就需要HK。所以建议两个模板都准备关键时候能救命。4.3 搜索策略DFS、BFS与剪枝搜索题是联想笔试的常客。常见的出题方式包括“矩阵中的路径”、“岛屿最大面积”、“N皇后”、“数独求解”等。这类题核心考察的是搜索方向的选择和剪枝策略。对于矩阵类搜索题有一个比较隐蔽的坑Python递归深度限制。如果你用DFS递归遍历一个200x200的矩阵默认递归深度可能不够会直接报RecursionError。所以笔试时写递归DFS之前可以显式设置import sys sys.setrecursionlimit(1000000)但如果递归层数实在太大最好改用栈实现的迭代版DFS或BFS。剪枝也是考察重点。比如N皇后问题最简单的优化是用三个集合记录列、主对角线、副对角线的占用情况而不是每次检查整个棋盘。对角线规律是主对角线上row-col相等副对角线上rowcol相等。这个模板要能手写。5. 动态规划与贪心建模能力的分水岭5.1 典型DP题型的联想命题偏好动态规划是联想的压轴题重灾区。考察频率最高的几类包括背包问题0-1背包、完全背包、最长递增子序列LIS、最长公共子序列LCS、编辑距离、区间DP。先说背包问题。0-1背包的基础状态转移方程是dp[j] max(dp[j], dp[j - weight[i]] value[i])唯一要注意的是遍历顺序0-1背包必须从大到小遍历容量完全背包从小到大遍历。这个点笔试选择题是必考的编程题里如果考完全背包很多人会在这里翻车。再看LIS。O(n^2)的DP做法是最容易想到的但如果有10万级别的数据量就必须用贪心加二分优化到O(n log n)。优化的核心是维护一个“最小末尾值”数组tails遍历每个数时在tails里做二分查找。这个方法很多人知道但现场写的时候经常忘记更新二分边界。区间DP在联想笔试中偶尔出现典型题目是“戳气球”或“合并石子”。这类题的代码复杂度不高但状态转移方程的推导过程很费时间。如果笔试时间不够我建议优先保证前两题AC第三题可以写一个暴力搜索拿部分分不要死磕。5.2 贪心算法什么时候敢用什么时候不敢用贪心算法在联想笔试里通常是用来解决“看起来像DP但实际有特殊性质”的题。比如“会议室安排”、“跳远游戏”、“分发饼干”等。用贪心的前提是能证明局部最优能推出全局最优。笔试时如果你没有充足的证明但样例都过了可以冒险提交毕竟编程题是按测试点给分的。但要注意一个典型陷阱“零钱兑换”问题就不能用贪心。虽然[25,10,5,1]这种标准硬币系统贪心可行但有些自定义硬币面额下贪心会得出错误答案。所以看到这类题第一反应应该想DP而不是贪心。5.3 模拟退火与粒子群AI岗位的加分题热搜词里出现了“粒子群算法原理”、“模拟退火算法”这些都是启发式优化算法在联想的AI方向算法岗笔试中偶尔出现。这类题通常不会让你实现完整算法而是考察概念理解或用于解决某些复杂的组合优化问题。最典型的是TSP旅行商问题的大规模版本精确算法算不了就可以用模拟退火或粒子群求近似解。如果你投的是AI算法岗建议了解模拟退火的核心步骤初始解生成、邻域扰动、Metropolis接受准则、温度衰减。笔试很可能让你实现或完善某个步骤。粒子群则需要理解“个体最优”和“全局最优”两个概念以及速度更新公式和位置更新公式的实现。6. 笔试实战技巧与避坑指南6.1 时间分配策略联想的算法笔试时间比较紧张我的建议是50%的时间做第一题和第二题25%的时间做第三题剩下25%时间用来检查边界条件和调试。一定要先读所有题目再动手写。有些题目看起来复杂实际可能是个简单的模拟题读完题你会发现可以用更简单的方式解决。比如有一道题看起来像是在考图论最短路但实际上约束条件里所有边的权重都是1那直接用BFS就行不必上Dijkstra。这种降维打击在笔试里很常见。6.2 处理输入输出的坑联想笔试平台支持stdin/stdout的输入输出不同语言模板略有不同。Python通常是用input()逐行读取遇到需要读取多行长度不一的输入时建议用sys.stdin.read().split()一次性读取再按索引访问这样一个循环就能解析完所有输入。另外要注意数据的数值范围。如果题目中说n最大是10^9那么用int类型没问题但如果涉及中间运算用Python的int不会溢出用C就必须考虑用long long。用Python写笔试虽然慢但胜在处理大数时不用考虑溢出问题这是很多人选Python的唯一理由。6.3 编程题模板速查表以下是我整理的一份面向联想笔试的模板清单建议考前逐个过一遍算法/数据结构推荐掌握程度典型场景KMP熟练手写字符串匹配、重复子串并查集熟练手写连通性判断、岛屿问题堆heapq熟练调用TopK、合并有序链表Dijkstra堆优化熟练手写带权最短路拓扑排序Kahn算法熟练手写课程表、依赖关系0-1背包 / 完全背包熟练手写资源分配、凑数问题树形DP了解思路树上最大独立集快速幂熟练手写大数取模、矩阵幂双指针熟练使用有序数组问题、滑动窗口前缀和/差分熟练使用区间求和、区间增减6.4 如何高效刷题备战联想秋招如果离笔试还有一周左右时间我的建议是按照上面表格里的清单每类算法找两三道经典题刷透不要贪多。重点刷LeetCode上标签为“字符串”、“图”、“动态规划”的高频题尤其是medium难度。联想笔试的难度天花板大概在LeetCode medium偏上一点极少出现hard级别的竞赛题。另外一定要在线上OJ上练几套完整的模拟题控制时间。我自己第一次参加联想笔试时就是吃了没练模拟题的亏时间分配完全失控第三题大篇幅留白。后来再战的时候就调整了策略每道题最多思考20分钟没思路先写暴力拿部分分剩余时间全部用来检查第一题的边界情况。7. 复盘总结与考场真实场景还原最后分享一个我在秋招时遇到的真实场景我报考的是联想研究院的算法岗当时的编程题比较典型。第一题是个简单字符串处理题用split和set就能解决第二题是判断两个矩形是否重叠并输出重叠面积考的是边界条件第三题是个带权区间调度问题本质上是个贪心加二分。说实话第三题我在平时刷题中见过类似的但因为题面包装得很啰嗦花了不少时间才看懂。那次笔试我最后只AC了两道半但还是顺利进入了面试环节。所以不要因为一道题没完全做出来就心态崩掉联想的评分标准往往不是“全对才给分”而是按测试点给分。第三题只要你的代码能通过前几个基本用例就能拿到不少分数。笔试和面试一样考察的是你在压力下的问题解决能力而不只是正确率。还有一点很值得注意联想笔试的软件工程岗和算法岗共用一套题的情况不少只是岗位标签不同。所以如果你是软开岗也别忽略算法准备。反过来如果你算法题不擅长可以提前练几道“字符串模拟”的题这在两个方向中都是性价比最高的投入。最后再分享一个小技巧笔试前一定要到官网查看岗位描述。如果岗位描述中出现“大规模数据处理”、“大规模推荐系统”等字眼那么笔试大概率会考与TopK、排序相关的题如果出现“计算机视觉”、“多模态”等字眼可能会考与矩阵运算、图像处理相关的基础题。根据岗位方向定向刷题比海量刷题效率高得多。据我观察联想秋招算法笔试的通过率其实不低难的是后续面试里的手撕代码和项目深挖。所以笔试阶段稳住心态、把基础算法题做扎实就已经超过一半的竞争者了。祝今年秋招的同学们都能顺利拿到想要的offer。
返回列表