ARTICLE DETAIL

资讯详情

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

2023联想秋招算法开发岗笔试真题复盘与高频考点指南

2023联想秋招算法开发岗笔试真题复盘与高频考点指南 每年九、十月份都是秋招最焦灼的时候2023年的联想秋招算法开发岗笔试我也完整跟下来了。如果你正打算投递联想的算法开发相关岗位或者想拿历年真题练手这篇内容应该能帮你省下不少瞎摸索的时间。联想的笔试和互联网大厂那种“上来就是四道ACM风格算法题”的风格不太一样它更看重基础算法功底的扎实程度同时对机器学习和深度学习的基础概念也有一定考察整体感觉是“广度优先、深度适中”但想拿高分也没那么容易。我尽量把这次笔试的题型结构、高频考点、容易踩的坑以及我的复盘心得都整理出来内容比较长但都是实打实的经验建议先收藏再慢慢看。1. 2023年联想秋招算法开发岗笔试的整体格局与定位1.1 算法开发岗和纯算法研究岗笔试要求有什么不同先搞清楚一件事联想的“算法开发岗”不是做纯学术研究的岗位它的核心工作是把算法落地到具体的业务场景里比如边缘设备的模型压缩、工业场景的图像检测、语音信号处理、推荐系统的在线推理优化等。所以笔试的侧重点和“算法研究员”完全不同——它不会考太深的前沿论文推导也不会要求你手写Transformer的全部细节但一定会考你“能不能把算法用代码实现出来并且实现得够不够稳”。从题型设计来看联想算法开发岗的笔试主要分成三块计算机基础与数据结构选择题、算法编程题、机器学习/深度学习基础选择题。前两块偏向传统软件工程师笔试第三块则是算法岗的差异化部分。如果你只刷LeetCode不看机器学习基础第三块会很吃亏反过来如果你只背深度学习八股前面的编程题又可能挂掉。1.2 2023年笔试的具体题型构成与时间分配先说考试形式2023年联想秋招算法开发岗笔试走的是在线笔试平台一共120分钟题型分布大致如下题型数量分值占比建议耗时单选题数据结构与算法15题约20%25分钟多选题机器学习/深度学习基础10题约20%25分钟编程题3题约60%70分钟编程题的分值占比非常高基本决定了你能不能进面试。三题难度一般是“简单 中等 中等偏上”的梯度排列第一题送分第二题需要想一想第三题涉及复杂的算法设计通常有比较明显的区分度。平台方面用的是常见的在线OJ系统支持C、Java、Python我建议优先用Python写程序题因为在编码效率上确实有优势后续细节我再展开。1.3 和互联网大厂笔试相比联想的出题风格有什么特点我拿2023年同期做过的几家互联网大厂笔试做个对照。互联网大厂更偏向“高难度、快节奏、靠套路”很多题目直接是LeetCode Hard级别的变形而且输入输出处理得比较干净核心就是考察你的算法设计能力。联想作为制造业出身的大型企业笔试风格更“学院派”一点不玩偏题怪题更看重基础算法的熟练度。举个直观的例子同样是考察字符串处理互联网大厂可能会出“编辑距离带权重且空间受限”这类复杂问题联想则更可能直接考KMP的next数组计算或者让你判断一个字符串能否由另一个字符串循环移位得到。这两种风格没有绝对的好坏但备考策略差别很大——刷题时没必要死磕太偏门的题把高频基础算法吃透再把机器学习基础补上赢面更大。2. 选择题考点拆解数据结构、排序、KMP这些基础到底怎么考2.1 数据结构选择题的常见陷阱联想的单选题出了不少关于栈、队列、二叉树、图、堆的基础题看上去简单实际陷阱不少。比如有一道题问“循环队列长度为n队头指针为front队尾指针为rear判断队满的条件是什么”很多人不看循环队列的牺牲一个存储单元的约定直接选了front rear这就是典型的扣分点。循环队列的队满条件是(rear 1) % n front队空条件是front rear这个细节必须刻在脑子里。另一个高频考点是二叉树的性质。比如“已知一棵完全二叉树的节点数为2023求叶子节点数”这类题要用到完全二叉树中度为1的节点数为0或1的特性。解法是总节点数n n0 n1 n2且n0 n2 1所以n 2*n0 n1 - 1。当n为奇数时n1 0n0 (n 1) / 2 1012当n为偶数时n1 1n0 n / 2。2023是奇数直接选出1012。这类题目不需要死记答案把推导过程弄明白才是关键。堆和优先队列也是选择题常客。比如“向小根堆中依次插入7个元素后堆顶元素是谁”这种题要么你手动模拟建堆过程要么直接理解堆的插入逻辑新元素放到堆尾然后与父节点比较小于父节点就上浮。手动模拟时特别注意插入不是一开始就建堆而是逐次插入并调整顺序错了结果就错了。2.2 排序算法不只是背时间复杂度的表排序算法在联想笔试里出现的频率极高选择题和编程题都会有涉及。最常见的是给你几组排序中间过程让你判断是哪种排序算法或者给你一个序列问冒泡排序在某一趟之后的状态。2023年的选择题里就有一道“初始序列为5, 2, 4, 6, 1, 3用直接插入排序写出第二趟排序后的结果”这题很简单第一趟认为5有序2插入后变成2, 5, 4, 6, 1, 3第二趟把4插到2和5之间结果是2, 4, 5, 6, 1, 3。说实话排序算法这块很多人只背那张“时间复杂度/空间复杂度/稳定性”表但笔试真正考的是你能不能写出某一趟的结果、能不能判断算法类型。稳定性也是个常考点选择排序是不稳定的比如5, 5, 2选择最小2和第一个5交换两个5的相对次序就变了堆排序、快速排序也都不稳定。我建议你把冒泡、插入、选择、快排、归并、堆排这六种算法都手写一遍尤其要注意快排的partition写法因为有些选择题会给你一个特定版本的partition过程问某次划分后的序列状态不同写法的结果可能有差异。值得一提的是快速排序的挖坑填数和左右指针交换两种实现在某些选择题中会导致中间结果不一样。比如序列3, 7, 8, 5, 2, 1, 9, 5, 4以第一个元素3为基准不同的partition写法第一趟结束时基准3的位置可能不同取决于你是从右往左找小还是从左往右找大以及如何处理等于基准的元素。所以复习时最好固定一种写法并且理解为什么相等元素会影响稳定性。2.3 KMP算法next数组计算是选择题高频但编程题也会考变形你搜“kmp算法”相关的热词能看到很多人都在问next数组的求法联想笔试确实考了这个考点。特别是题目中给出模式串pabacaba需要你求next数组这道题我当时印象深刻因为它看起来不难但非常考察对next定义的理解是否清晰。不同的教材和教程对next数组的定义有细微差别有些定义为“最长相等前后缀的长度”有些定义为“最长相等前后缀长度减1”还有些定义为“失配时模式串跳转的位置下标”从0开始还是从1开始又不一样。联想这道题基本是按“next[i]表示模式串前i个字符组成的子串中最长相等前后缀的长度”来定义的注意这里next[i]的i从1开始计数即next[1] 0表示第一个字符没有真前后缀。以p abacaba为例手动推导一遍next[1] 0子串a没有真前后缀。next[2]子串ab最长相等前后缀长度为0next[2] 0。next[3]子串aba前缀a和后缀a相等长度为1next[3] 1。next[4]子串abac前缀a和后缀c不相等、前缀ab和后缀ac不相等所以next[4] 0。next[5]子串abaca前缀a和后缀a相等长度为1前缀ab和后缀ca不等前缀aba和后缀aca不等所以next[5] 1。next[6]子串abacab前缀ab和后缀ab相等长度为2next[6] 2。next[7]子串abacaba前缀aba和后缀aba相等长度为3next[7] 3。如果你用的教材是“next[i]表示最长相等前后缀长度减1”那套结果就是0, -1, 0, -1, 0, 1, 2如果是“失配时跳转位置且从0开始计数”那套结果会变成0, 0, 1, 0, 1, 2, 3。做题前一定要看清楚题目对next数组的定义这是最容易翻车的地方。KMP在编程题里一般不会让你裸写而是给一个场景比如“判断一个字符串能否通过另一个字符串循环移位得到”这实质上就是“将原串拼接一次后做KMP匹配”。备考时不仅要把next数组的求法弄熟还要理解KMP的匹配过程主串指针不回退模式串指针按next数组回退。能够在20分钟内默写出完整KMP代码才算这个考点真正过关。2.4 图论与贪心、剪枝算法的选择/简答考点选择题里还有一些图论基础题比如“给定邻接矩阵求从顶点0到顶点3的最短路径长度”、“判断一个图是否存在拓扑排序”等。Dijkstra算法是常考的它的核心是贪心策略每次从未确定最短路的顶点中选dist最小者松弛其邻接边。注意事项也很经典Dijkstra不能处理负权边因为一旦有负权边当前贪心选出的最小dist不一定就是全局最优。如果题目里出现负权边首选Bellman-Ford或SPFA。贪心算法本身也会直接考察。比如区间调度问题给你若干区间选择尽可能多的互不重叠区间。按区间结束时间排序依次选择不冲突的区间就是最优解。这种题不仅选择题会考编程题也经常出成第一题或者第二题的难度。剪枝算法更多出现在搜索类编程题中比如“求一个矩阵中从左上角到右下角的路径数量某些格子有障碍物”这类题DFS会超时需要用记忆化搜索本质就是剪枝。选择题可能会问你“回溯法和分支限界法的区别”这种概念题也需要准备一下因为联想笔试偶尔会混一些算法理论题进来比如“A*算法中启发函数h(n)满足什么条件时一定能找到最优解”答案是h(n)不大于真实代价即满足可采纳性。3. 机器学习与深度学习考点算法开发岗笔试的另一只靴子3.1 传统机器学习K-Means聚类、KNN这些经典算法是常客联想作为业务覆盖面很广的企业算法开发岗涉及的业务可能包括工业质检、设备预测性维护、供应链预测、用户画像等所以传统机器学习算法在笔试中占了不小的比重。多选题部分出了不少这方面的题比如K-Means聚类的选择题“K-Means聚类中K值如何确定”常用方法有肘部法则Elbow Method、轮廓系数Silhouette Coefficient、Gap Statistic等。题目可能会让你根据给定的SSE下降趋势选择合理的K值。“K-Means对初始质心敏感如何改善”答案是多次随机初始化选取最优结果或使用K-Means算法。KNN也有经典考点“KNN算法的应用能力包括哪三个方面”这个问题其实就是考察KNN用于分类、回归和异常检测这三类任务。KNN做分类时取K个最近邻中线数最多的类别作为预测结果做回归时取K个最近邻的目标值均值做异常检测时如果样本与邻居距离过远可以标记为异常点。这种题不算难但知识面不够广的话容易漏选。其他可能出现的传统算法考点还包括决策树与信息增益信息熵的定义、ID3、C4.5、CART的区别。比如“信息增益越大表示特征对分类的贡献越大”这种判断题。支持向量机最大间隔的思想、核函数的作用、软间隔参数C的含义。朴素贝叶斯条件独立性假设、拉普拉斯平滑的作用。集成学习Bagging与Boosting的区别随机森林与GBDT、XGBoost的关系。3.2 深度学习基础损失函数、优化器、经典网络结构一个都别落下深度学习部分的选择题难度中等但知识点覆盖很广。2023年出现了“在深度学习中下列哪些操作可以防止过拟合”这种多选题选项包括Dropout、权重衰减L2正则化、数据增强、Batch Normalization、早停Early Stopping大部分都是对的但“增加网络深度”不是防过拟合手段反而可能加剧过拟合这就要靠理解去判断。损失函数也是一个考点。比如“对于二分类问题为什么常用交叉熵损失而不是均方误差”核心原因是交叉熵配合Sigmoid激活函数可以缓解梯度消失问题。如果用均方误差反向传播时会包含σ(z)项而Sigmoid的导数在两端趋近于0导致梯度很小训练极慢交叉熵的梯度是(p - y)只与预测和真实的差有关不包含导数项训练更稳定。优化器方面也有题目“Adam优化器结合了哪两种优化方法的优点”答案是Momentum和RMSProp。Momentum用指数加权平均累积历史梯度方向起到加速和稳定作用RMSProp对梯度平方做指数加权平均自适应调整各参数的学习率Adam两者结合是目前最常用的默认优化器之一。经典网络结构也是笔试常客特别是图像算法相关的岗位。LeNet、AlexNet、VGG、ResNet这些你要能说出大概ResNet提出了残差连接跳跃连接解决了深层网络退化问题。题目可能会问“ResNet中残差块的核心思想是什么”答案是学习残差F(x) H(x) - x而不是直接学习H(x)当网络已经收敛到最优时残差趋近于0网络学习变成恒等映射从而允许网络加深。3.3 容易被忽略的信号处理与控制类算法考点联想算法开发岗有相当一部分业务涉及设备控制和信号处理所以笔试偶尔会出现一些“非常规算法”的考点。比如PID算法热词里频繁出现“PID算法在CRPS PSU Power的作用”“增量式PID算法”这在联想这种有服务器、电源业务的公司的笔试里真的出现过。PID算法考的是基础概念P比例决定响应当前误差I积分消除稳态误差D微分抑制超调。选择题会问你“增大比例系数Kp会带来什么影响”答案是系统响应变快但过大会导致超调甚至振荡又比如“积分环节的主要作用”答案是消除稳态误差。增量式PID和位置式PID的区别也可能出现在多选题里增量式输出的是控制量的增量不需要累加误差误动作影响小适合执行器带保持功能的场景。卡尔曼滤波也是一个潜在考点。如果笔试面向机器人或智能设备方向就可能出现“卡尔曼滤波的两个主要步骤是什么”这种题答案是预测Predict和更新Update。或者给你简单的状态转移方程让你理解它如何融合传感器测量值和模型预测值。复习时不需要推完整的公式推导但至少要理解它“用预测值修正测量值、用测量值修正预测值”的核心思想。音频重采样算法、图像锐化的拉普拉斯算法这类信号/图像处理考点也可能出现。拉普拉斯算子是一个二阶微分算子用于提取图像的边缘信息锐化的本质是原图减去或加上取决于符号约定拉普拉斯响应增强边缘对比度。这种题一般出现在岗位方向更偏图像/音频的批次里如果你的投递方向涉及这些业务复习时需要多关注。4. 编程题的实战策略从输入输出到时间分配4.1 在线笔试平台输入输出处理最容易丢分的地方我见过太多人挂在输入输出上。2023年联想用的是常见在线测评系统虽然已经简化了不少但Python的input()读取多行输入、C的getline()处理含空格的字符串这些基本功必须扎实。笔试的编程题一般有明确的输入输出格式说明第一题通常会把“第一行输入一个整数T表示测试用例组数每组用例第一行输入n和m第二行输入n个整数...”这种格式定义得非常清楚照做就好。有一个细节值得注意Python的input()每次调用会读到换行符为止如果输入中有空行需要用try-except或sys.stdin.readline()处理。对于大规模输入直接用input()可能会稍慢但笔试题目一般不会大到需要手写快读的程度。C同学则要记得加上ios::sync_with_stdio(false); cin.tie(0);否则大数据量时cin可能超时。这些都是考场上的老生常谈但每年都有人犯。4.2 三题梯度应对策略先拿稳分再啃硬骨头时间分配上我的建议是第一题控制在15分钟内完成第二题控制在20到25分钟剩下的时间全部给第三题和一题检查。第一题基本是送分题比如“给定数组求相邻元素差的最大值”或者“判断回文串”这种题你如果5分钟还没思路说明状态没调整好建议先深呼吸换个角度想一想大概率就是基础遍历。第二题通常是中等难度的模拟或贪心题2023年我遇到的一道是“给定一组任务和它们的截止时间每个任务耗时相同如何安排才能完成尽可能多的任务”。标准解法是按截止时间排序用优先队列维护已选任务的耗时如果当前任务超期就替换掉已选任务中耗时最长的一个。这个思路属于“贪心 优先队列”的经典组合LeetCode上“课程表III”就是类似题目备考时建议把这类题单独归类复习。第三题往往是树或DP的题需要较长时间的思考。我的策略是读完题后先在草稿纸上列状态定义和转移方程不急着写代码。如果10分钟后还没思路果断写一个暴力版本过30%到50%的测试用例也比空着交白卷强。联想的笔试评分通常是按通过用例比例给分的所以“部分正确”是有价值的。4.3 从真题复盘看一道树形DP题的实际思考过程第三题我当时遇到了一道树形DP题大致场景是给定一棵树每个节点有权值要求选出一个最大权值子集使得子集中任意两个节点不能相邻即不能同时选父子节点。这就是经典的“打家劫舍III”的树上版本。这类题的状态定义是dp[u][0]表示不选节点u时以u为根的子树能获得的最大权值。dp[u][1]表示选节点u时以u为根的子树能获得的最大权值。转移关系是如果选u那么u的所有孩子都不能选dp[u][1] val[u] sum(dp[v][0])。如果不选u那么每个孩子可选可不选dp[u][0] sum(max(dp[v][0], dp[v][1]))。用DFS从叶子到根做后序遍历即可。这道题的关键在于把“树”这个结构看穿写出递归转移而不是试图用循环遍历整棵树的所有子集。把这道题吃透之后类似的“树上最大独立集”“树的最大支配集”问题也就都有了基础考场遇到就不会慌。4.4 手撕代码前必须确认的几件事编程题提交前一定要检查边界条件数组长度为1时算法是否正确输入数字可能是0或负数吗目标值不存在时该返回什么空树、空链表的情况处理了吗这些是扣分的重灾区也是很多“以为自己能满分实际上只过了60%用例”的根源。另一个容易忽略的是输出格式有些题要求精确到小数点后6位有些要求“每个结果占一行”有些要求“结果之间用空格分隔”。联想的在线测评会逐字对比输出格式多一个空格、少一个换行都可能被判错。交卷前留出两分钟专门检查输出格式这条建议价值千金。5. 其他算法热点的延伸准备粒子群、模拟退火、BM25这些需要掌握到什么程度5.1 元启发式算法粒子群、模拟退火在笔试中是什么定位你看到的那些热词里有很多像“粒子群算法原理”“模拟退火算法”这种偏计算智能方向的词。联想的部分岗位如果有优化调度、参数寻优类的业务笔试确实可能涉及这类算法但考察深度不会到让你手写完整粒子群代码的程度。通常是选择题或者简答题问“粒子群算法中惯性权重w的作用是什么”或者“模拟退火算法如何避免陷入局部最优”。粒子群算法的核心概念每个粒子有位置和速度通过个体历史最优pbest和群体历史最优gbest来更新速度与位置。惯性权重w控制粒子保持原有速度的程度w大则全局探索能力强w小则局部开发能力强。模拟退火算法则是以一定概率接受更差的解而这个概率随温度下降逐渐减小从而跳出局部最优。理解“Metropolis接受准则”和“温度衰减方式”就足够应对笔试了。5.2 检索与排序方向BM25算法可能出现在什么场景联想有搜索、推荐相关业务线所以BM25这种经典的信息检索算法也可能出现在选择题或简答题里。BM25的核心思想是对查询中的每个词计算它和文档的相关性得分然后加权求和。它基于词频TF和逆文档频率IDF并引入了文档长度归一化。如果考到BM25选择题一般会给一个场景“在一个文档集中词A出现在较少的文档中词B出现在几乎每篇文档中当查询包含A和B时哪个词对相关性得分贡献更大”答案显然是词A因为它的IDF更大。理解和掌握TF-IDF与BM25的异同就能应付这类题目更深层的公式推导一般不会要求。5.3 A*搜索、Rete算法这类冷门考点要不要专门复习热词里还有“规则引擎Drools的Rete算法实现原理”“A*算法”“二分图HK算法”等这些属于特定方向的知识我不建议花大量时间去深挖除非你已经通过面试官或论坛确认了岗位方向确实涉及这些内容。Rete算法是规则引擎Drools中用于高效匹配规则的模式匹配算法通过构建规则网络来减少事实匹配的次数这在日常开发岗位笔试里出现的概率极低遇到了也只能凭借平时积累的知识面来应对。我的态度是备考优先级上排序和KMP这类基础算法优先级最高机器学习/深度学习基础次之粒子群、模拟退火、BM25这类再次冷门算法最后。笔试时间有限把前两类做到极致远好过把时间分散在冷门考点上。6. 常见问题与排查技巧我踩过的坑和复盘总结6.1 笔试过程中常见的时间杀手和应对方案第一个坑是“在一道选择题上纠结太久”。联想的笔试允许你标记题目后返回修改所以遇到拿不准的选择题先凭第一直觉选一个标记起来等编程题写完了再回头想。我身边有同学因为在一道多选上磨了8分钟导致最后一题编程时间不够空了一问非常可惜。第二个坑是“写完了代码却不自测”。在线编程题一般有“调试”按钮可以跑样例但样例覆盖的只是最简单的情况。提交前应该自己构造几个边界测试用例比如空数组、全相同元素、超长字符串、负数输入等跑通再提交。这个习惯能显著提高通过率因为样例通过得越多系统判分越高部分平台每通过一个测试用例就给一个点的分。第三个坑是“Python缩进混乱”。如果平时习惯用Jupyter或者本地IDE对缩进不敏感考场上手写代码时就容易翻车。建议提前习惯用纯文本编辑器写代码考试时也一定要留意缩进。特别是用递归写树相关题目时缩进错了整个逻辑就乱了。6.2 常见笔试慌张场景及心理调节方法还有一类问题是心态。我笔试第三题做到一半突然卡住脑子一片空白只记得状态转移方程写不出来。当时我的处理方法是先在草稿纸上画一棵小树比如5个节点手动模拟一遍“选/不选”的过程把dp值一个个算出来写着写着就发现规律了。这种“小规模手算”的方法特别适合在卡壳时激活思路比空想有效得多。另外一个调节方法是“先做会做的第二题再做不会的第三题”。笔试的时候题目的呈现顺序不一定要等同答题顺序。如果第三题难到无从下手先把第二题的代码写完、跑通、确认无误再回头啃第三题。这样即便第三题只写了一半也有两题保底通常已经能拿到不错的成绩。6.3 笔试后的复盘与面试准备的衔接笔试结束别急着庆祝或者灰心立刻打开备忘录把还记得的题目记下来。联想的考题风格变化不算大多场笔试之间经常出现相似考点记录题目能帮你在后续批次或明年面试时少走弯路。我当时把做错的KMP next数组定义问题记了下来后续多家公司笔试还真遇到类似的题直接把正确答案选出来了。笔试通过后一般紧接着是技术面试面试官很可能会问“你笔试时某道题是怎么思考的”这时候你能拿出草稿纸上的推导过程详细讲一遍会非常加分。所以平时刷题时养成“记录解题思路和复杂度分析”的习惯不仅为了笔试也为了面试叙述。6.4 根据个人经验整理的避坑清单选择题先判断选项“是否符合该算法定义”再看“是否在特定条件下成立”多选题宁少勿多拿不准的不选。编程题先写“核心逻辑的伪代码”确认无误后再写正式代码。直接上手敲代码容易陷入细节无法自拔。数据输入使用sys.stdin.read()读取全部输入后按行解析比多次调用input()更稳妥。循环边界所有涉及数组下标的循环都要检查是否可能越界特别是访问i1、i-1、j1这类相邻元素时。时间复杂度题目给的数据范围如果是n ≤ 10^5千万别写O(n^2)的暴力算法O(n log n)是安全的。备用环境确保本地能跑的代码在在线OJ环境也能跑避免用本地特有的库。最后再说两句关于复习节奏的实在话我自己的备考节奏是提前六周开始前三周集中刷LeetCode高频题和代码随想录的专题重点复习数组、链表、哈希表、字符串、二叉树、回溯、贪心、DP、单调栈这些第四周和第五周补充机器学习与深度学习基础第六周做真题和模拟题。联想笔试的难度和题量这样规划基本够用。如果你时间更紧凑优先保证能把LeetCode Hot 100中的简单和中等题做到“见题有思路、20分钟内能写出来”同时把KMP、快排、归并、堆排这几样基础算法的代码背得滚瓜烂熟再花两个晚上把机器学习基础八股过一遍笔试过线希望就很大了。最后分享一个小技巧笔试前找几个同学组队模拟一次严格按照120分钟时限做一套模拟题让同组人帮你检查输入输出和边界问题。我第一次模拟时才发现自己在时间和心理压力下容易犯低级错误第二次就明显好了。别小看这个练习笔试拼的不只是知识储备也是临场状态。祝今年秋招的同学都能顺利进入面试。
返回列表