☰
联想秋招编程岗笔试实战复盘:考点解析与备考策略
2026/10/10 11:00:13 网站建设 项目流程

这是一个关于2023年联想秋招编程岗笔试的实战复盘帖子。我去年亲历了联想秋招的完整流程,笔试环节筛人比例比想象中高不少,而且题目风格和互联网大厂那一套有明显区别。如果你正在准备联想或者其他大型制造企业的软件研发岗,这篇内容应该能帮你少走很多弯路。

先说结论:联想秋招编程岗笔试整体难度中等偏上,不是那种“一道hard题定生死”的极端模式,而是“基础扎实度+代码熟练度+工程思维”的综合考察。它的题库设置很有特点,选择题占比高,考点覆盖面广,编程题以中低难度为主但考察很细致。所以想靠临时刷两道LeetCode就混过去是不太现实的。


1. 联想秋招笔试的整体设计与试卷结构

1.1 笔试形式与时间安排

联想秋招编程岗笔试采用的是在线统一考试,用的是牛客网的平台。我当时参加的那场,总时长是120分钟,题量不算少,而且选择题和编程题是放在同一套卷子里连续作答的,这意味着你需要自己控制节奏,不能在某一板块卡太久。

整套卷子的题量我记得大概是30道左右的选择题加上2到3道编程题。这里有个很重要的信息,不同批次的题目数量不完全相同,有的批次是30道选择+2道编程,有的批次是25道选择+3道编程,但整体框架是稳定的。笔试时间一般会安排在晚上,比如19点到21点,所以白天还有完整的时间做最后一轮复习和模拟。

需要特别提醒的是,联想的笔试系统比较严格,要求开启摄像头,并且会监控切屏行为。一旦切屏超过一定次数,系统会自动交卷。我那一场就有同学因为在本地IDE和浏览器之间来回切换写代码,触发了防作弊机制。所以如果你平时习惯在本地IDE里调试,最好提前适应牛客网的在线编辑器,或者至少准备好两个屏幕的切换方案,但最保险的做法是直接在在线编辑器里写完。

1.2 试卷结构与考察模块分布

整张试卷的模块划分很清晰,大致可以分成操作系统、计算机网络、数据库、数据结构与算法、编程语言基础,外加几道和硬件或嵌入式相关的题目。这和互联网大厂的笔试风格有明显差异,大厂更偏重算法题,而联想的笔试更看重计算机基础知识的广度,这和它的业务属性是有关系的——联想有大量的硬件产品线,软件岗也需要对底层技术有基本了解。

从分数占比来看,选择题占大头,编程题虽然题量少但分值很高,一道编程题的分值往往顶得上十道选择题。所以如果你选择题基础一般,但能写出两道以上的完整编程题,通过率依然不低。

这里有一个值得注意的点,选择题里有一批题目是围绕Linux操作系统和C/C++内存管理展开的。如果你是平时主要写Java的业务开发,这一块可能需要额外补一下。反过来,如果你平时玩Linux比较多,做这套卷子会觉得选择题非常顺手。我在考场上就明显感觉到,凡是涉及Linux进程管理、内存布局相关的题目,几乎都是送分题,但对我旁边那位只写Java的同学来说,可能就是丢分重灾区。


2. 选择题核心考点拆解与易错点复盘

2.1 操作系统与计算机网络高频考点

选择题里操作系统部分占比最高,大概有八到十道题,重点集中在进程线程区别、进程同步互斥、死锁产生的四个必要条件、虚拟内存与页面置换算法、磁盘调度算法这些经典内容上。

我印象很深的一道题是关于页面置换算法的,给出了一个访问序列,让计算在LRU算法下的缺页次数。这类题纯靠手算,没有什么技巧,关键是平时多练几遍,把FIFO、LRU、OPT三种算法的模拟流程彻底搞清楚。我在备考时把这类题反复做了十几道,到考场上一看到类似题目基本就是条件反射式地写答案。

计算机网络方面,重点在TCP三次握手和四次挥手、TCP与UDP的区别、拥塞控制机制,以及HTTP协议的状态码和请求头。联想特别喜欢考TCP的TIME_WAIT状态,我考场上遇到了一道四选一的题,问的是TIME_WAIT状态持续的时间是多久,以及为什么需要这个状态。这里有个容易混淆的知识点,TIME_WAIT持续的时间是2MSL,为什么是两个最大报文段生存时间,因为要确保发送的最后一个ACK报文能够到达对端,同时让本连接内所有迟到的报文段都自然消失,避免干扰新连接。

计算机网络这部分还出现了一道关于IP地址划分子网的题,给出了一个IP地址和子网掩码,让计算网络地址和广播地址。这类题只要掌握了“与运算”的规则就能做出来,但很多同学平时写业务代码不接触网络层,导致临场反应慢。我建议考前把IPv4地址分类和子网划分的规则重新过一遍,花不了多少时间,回报率却很高。

2.2 编程语言基础与数据结构的考察角度

编程语言基础的选择题很有意思,它不限定于某一种语言,而是同时考察Java、C++和C语言的知识点。比如有一道题是关于Java中HashMap在多线程环境下会有什么问题的,本质是在考并发容器和线程安全。另一道题是关于C++虚函数表的内存布局,问虚函数存在什么区域,答案是只读数据段,这道题很多只写Java的同学直接懵了。

C语言部分主要考察指针和内存管理。有一道题是关于指针数组和数组指针的区别,给出的代码是int *p[10]和int (*p)[10],让选择两者的区别。这类题就是典型的送分题,只要理解运算符优先级就能做对,但每年都有不少人在上面翻车。还有一道题是关于动态内存分配和释放的,涉及malloc和free的配对使用,以及内存泄漏的判断。

数据结构部分,重点在链表和二叉树的操作。有一道题要求判断中缀表达式转后缀表达式的过程,需要用到栈的模拟。这种题在纸上推演一遍就能得到答案,但如果你太久没写数据结构代码,可能连“后缀表达式”的求值规则都想不起来。所以备考期间我建议把栈、队列、二叉树遍历、堆排序这几个基础数据结构重新用代码实现一遍,不是为了笔试考代码实现,而是为了建立“肌肉记忆”,遇到相关概念题时能迅速反应。

还有一个高频考点是排序算法的稳定性与时间复杂度。选择题常问“下列哪种排序算法是稳定的”,答案是归并排序和插入排序。但这里有个陷阱,有时候题目会问“快速排序在什么情况下表现最差”,正确答案是“序列已经有序时”,此时退化成O(n²)。这类题比较基础,但需要你把这几种常用排序的特性表背熟。

2.3 数据库与SQL选择题的常见坑

数据库方向的选择题量在四到六道之间,主要考察SQL语法、索引优化和事务隔离级别。

有一道典型的题是给出一张学生成绩表,要求写一个SQL查询,查出各科成绩都及格的学生名单。这个需求用常规的GROUP BY和HAVING组合就能实现,但很多选项里会故意加入隐患,比如没有加GROUP BY却使用了聚合函数,或者WHERE子句里使用了聚合函数,这些都是明显的语法错误,需要你一眼识别出来。

索引优化方面,有一道题是关于联合索引的最左前缀原则的,给了一个基于(a, b, c)的联合索引,选项里有四种不同的查询条件,问哪个查询能用到索引。这里要特别注意最左前缀原则:如果查询条件里没有a字段,那么联合索引完全失效。很多有实际项目经验的同学反而容易在这道题上栽跟头,因为平时写的SQL都是ORM生成好的,很少手动设计索引。

事务隔离级别也是联想笔试的高频考点,重点在脏读、不可重复读和幻读分别对应哪个隔离级别。这道题如果你日常开发用的是MySQL的默认隔离级别(可重复读),可以很清楚记得:读未提交会存在脏读,读已提交解决脏读但存在不可重复读,可重复读解决不可重复读但存在幻读,串行化解决所有问题但并发性能极差。把这张表记清楚,遇到事务相关的选择题基本稳拿。


3. 编程题实战:三道典型题目与完整解题思路

3.1 字符串处理题:压缩连续重复字符

联想笔试的编程题风格偏向工程应用,很少出那种纯粹的脑筋急转弯型算法题。我遇到的第一题是给一个字符串,要求把连续重复出现的字符压缩成“字母+出现次数”的形式,但是要求只在压缩后长度小于原字符串时才输出压缩结果,否则输出原字符串。

这种题考察的是最基本的字符串遍历能力,属于LeetCode上的简单题级别。核心思路是遍历字符串,统计每个连续段的长度,然后组成新的字符串。但联想在这里加了一个小门槛——如果压缩后的字符串比原字符串长,就输出原字符串。这意味着你至少需要先遍历一遍才能确定是否压缩,如果你用一次遍历边压缩边拼接,最后还需要做一次长度比较来决定输出。

我当时用的思路是声明一个StringBuilder,遍历原始字符串,用两个指针记录当前字符和连续长度,然后拼接成“字符+数字”的形式。遍历结束后,比较压缩结果和原始字符串的长度,再决定返回哪个。

这道题的难度并不高,但很能检验你写代码的严谨程度。字符串为空的边界情况、单个字符的情况、全是相同字符的情况,这些都需要在代码里考虑清楚。另外在牛客网的在线编辑器上写这道题时,要注意输入输出格式,牛客网的题目通常是要求从标准输入读取,再通过标准输出打印结果。如果你平时习惯了力扣那种直接调用函数的方式,到了牛客网上可能会因为没写正确的输入输出处理而白白丢分。

3.2 动态规划题:最小跳跃次数变体

第二道编程题是一道动态规划题,给了一个数组,每个元素表示从当前位置最多能向前跳的步数,要求计算从第一个位置跳到最后一个位置的最少跳跃次数。这个题的原型是LeetCode上的“跳跃游戏II”,但联想在场景上做了一点包装,改为描述成“小明需要通过一系列石头过河,每个石头上标注的数字表示从该石头最多能跳出的步数”。

这类题有两个经典的解法。第一种是动态规划,用dp[i]表示跳到第i个位置需要的最少步数,转移时遍历所有能跳到i的位置j,取最小值加一。这个解法的时间复杂度是O(n²),在数组长度不太长的情况下可以通过。第二种是贪心加双指针的解法,维护当前一步能到达的最远位置和下一步能到达的最远位置,遍历一遍数组即可,时间复杂度是O(n)。

考场上我最先想到的是贪心解法,因为这道题我在刷题时做过原题,解题思路比较清晰。但如果没见过这道题也没关系,使用O(n²)的动态规划解法同样能拿分,无非是效率低一些,但笔试判题通常只验证正确性,不会像竞赛那样卡超时。

写这道题时有一点值得注意,边界情况的处理。如果数组长度为1,说明已经在终点,最少跳跃次数是0。如果数组的第一个元素是0,且长度大于1,那么永远无法移动,应该返回一个特殊值。我在考场上的做法是在代码开头先处理这三种边界情况,再进入主逻辑,尽量避免在核心逻辑里到处加判断条件。

3.3 数据结构题:基于HashMap的缓存淘汰策略

第三道编程题是设计一个简单的LRU缓存结构,支持get和put操作,要求在O(1)时间复杂度内完成。这题的原型是LeetCode上的“LRU缓存”中等难度题,是联想笔试题库里比较有区分度的一道题。

如果你参加过其他大厂的笔试,一定对这道题不陌生,因为它是衡量候选人数据结构功底的标准题。但很多第一次遇到的考生会卡在“如何在O(1)时间内完成删除最久未使用元素”这一步。解法很固定,用HashMap存储键和对应节点的映射,再用双向链表维护访问顺序,每次访问某个键时,把它对应的节点移动到链表头部,当容量满了需要淘汰时,删除链表尾部的节点。

我在考场上用的是Java语言,直接实现了Node内部类和双向链表的增删操作。这里有个细节,在实现get和put时,涉及到节点在链表中的删除和插入操作,你要特别注意双向链表节点的prev和next指针的更新顺序,否则很容易出现空指针异常。

这道题本身就是一道高频面试题,但不同公司的考察侧重点不太一样。联想在题目描述里没有要求你说明哈希表存的是什么、双向链表里存的是什么,但如果你在代码里做了清晰的注释,或者在方法命名上体现出设计意图,这种写代码的习惯会在后续人工简历评估阶段加分。虽然机器判题只能看测试用例是否通过,但笔试通过后的简历筛选仍然会有人工介入,代码风格是否整洁是可以被看到的。


4. 笔试环境准备与在线答题的实战细节

4.1 环境与设备:摄像头、浏览器与本地IDE的取舍

联想秋招笔试采用的是牛客平台,进入考试系统前会做一个全屏检查,要求使用Chrome或Edge浏览器,并且需要开启摄像头权限。我当时因为电脑摄像头的驱动有点问题,折腾了十几分钟才弄好,导致比别人晚开始答题。这个过程看起来不起眼,但对考试心态的影响非常大。

如果条件允许的话,强烈建议在正式笔试前一到两天,先进入牛客网的模拟笔试环境,测试一下摄像头、麦克风和浏览器兼容性。牛客网有个模拟考试入口,里面的流程和真实考试完全一致,可以提前走一遍全屏切换、代码输入、调试输出的整体流程。

另外,关于本地代码编辑器和在线编辑器的问题,很多考生习惯在本地的IDE里写代码,调试通过后再粘贴到在线编辑器。这个操作虽然方便,但在牛客网的监考系统下是有风险的。笔试说明里明确规定,禁止在考试期间使用本地IDE,违者按作弊处理。监考系统虽然不一定能检测到你本地打开了什么软件,但全屏锁定状态下切出页面去用本地IDE,只要切出次数多了,就会被系统标记。建议考前一周就开始适应牛客网的在线编辑器,它的代码提示和补全功能虽然比不上本地IDE,但应对笔试足够用了。

4.2 判题规则与输入输出格式的标准写法

牛客网笔试平台的编程题判题方式是需要你写完整的程序,从标准输入读取数据,并把结果打印到标准输出。这和力扣那种只需实现函数核心逻辑的方式完全不同。

举个例子,如果题目要求输入一个整数n,接下来一行有n个数字,很多只刷力扣的同学会习惯性地写一个接收数组作为参数的方法,然后在main方法里直接调用。但在牛客网上,你需要自己解析标准输入。Java里推荐用BufferedReader加StringTokenizer的方式读取,比Scanner快不少,尤其在数据量较大时性能更稳定。

对于输出格式,联想笔试的判题系统对多余的空格和换行是有容忍度的,但不意味着你可以随意输出调试信息。我在模拟环境里发现,如果在答题代码里留下了System.out.println的调试语句,可能会导致多输出了内容,影响判题结果。

有一个很实用的小技巧:编程题的第一题通常是A+B类型的输入输出示例题,用来帮助考生确认格式。正式笔试时一定要先做这道题,它能帮你确认平台的基本输入输出方式,还能在考试开始时迅速进入状态。

4.3 时间分配策略:选择题与编程题的最佳节奏

整场笔试120分钟,如果在选择题上耗掉太多时间,编程题就会变得很仓促。我个人的建议时间分配是:选择题控制在60到70分钟以内,剩下50到60分钟留个编程题,其中留出最后10分钟用来检查提交状态和补充明显的bug。

选择题里如果遇到完全陌生的题目,不要死磕,先标记一下,直接跳到后面的题。牛客网的选择题是允许跳题的,你可以在做完所有题后再回来处理标记的题目。按照我的经验,第一轮快速做选择题,把会做的全部确定答案,不会做的标记起来,大概能在45分钟内完成一轮。然后回头主攻标记题,这个时候因为已经做完了其他题目,心态会稳定很多,有时候反而能回忆起相关知识点。

编程题每道题限定时间也有讲究。第一道简单题控制在15分钟以内,第二道中等难度题控制在20分钟以内,第三道如果顺利的话还能剩20分钟,如果不顺利,果断放弃并保证前两道题的正确性。我的原则是,宁可全部提交,不要憋一道题。因为只要有一道题没有提交,这道题的分数就是零,而已经提交的题目即使有部分测试用例没过,也还能拿到一定比例的分值。


5. 常见问题与避坑指南:那些考场上踩过的坑

5.1 编程题常见错误与排查方法

编程题提交后显示编译错误或答案错误,是很多考生最头疼的事情。根据我的经验,发生这类问题通常有以下几种原因。

第一种是编译错误,最常见的是类名没有写成Main。牛客平台的Java判题环境要求Java主类名称必须是Main,否则报错。这个问题看起来很低级,但每年都有不少人犯。我建议在提交前检查一遍你写的public class后面跟的名字,确保是Main而不是你在本地IDE里定义的类名。

第二种是运行超时。如果代码的逻辑本身正确,但测试数据较大,使用的是O(n²)的算法就可能在极限用例下超时。这时候通常需要优化算法。比如前面提到的跳跃游戏的题目,用O(n²)动态规划虽然能跑通小数据,但当数组长度到达10^5级别时必然超时。应对方法是提前把常用的算法模板都准备好,做到“看到题目就能反应出最优解”。

第三种是答案错误,可能出在边界条件上。数组下标越界、未处理输入为空的情况、循环条件写错等,都会导致部分用例无法通过。我在考场上常用的一种排查方法是,自己在头脑里构造几个特殊用例,比如空数组、只有一个元素、全是相同元素、已经有序的序列,然后用逻辑推演一下代码的运行过程,往往能很快定位到边界处理的漏洞。

5.2 选择题常见知识点混淆与记忆技巧

选择题中有些知识点容易混淆,我整理了一张速查表,考前过一遍能减少不少失误。

知识点对比高频混淆点正确区分方法
进程与线程谁拥有资源、谁只是调度单位进程是资源分配的基本单位,线程是CPU调度的基本单位
TCP与UDP是否面向连接、是否可靠TCP是面向连接的可靠传输,UDP是无连接的不可靠传输
HTTP状态码301、302、403、404、500经常混淆301永久重定向,302临时重定向,403禁止访问,404未找到,500服务器内部错误
虚拟内存缺页中断与页面置换的关系先发生缺页中断,再选择淘汰页面,执行页面置换
进程间通信管道、消息队列、共享内存的区别管道是半双工,消息队列是内核缓冲区,共享内存最快但需要同步机制
死锁死锁预防与死锁避免预防是破坏四个必要条件之一,避免是银行家算法动态分配

这些知识点看起来非常多,但你把它们归纳成“操作系统一组”“网络一组”“数据库一组”之后,按组复习效率高很多。而且联想的选择题出题有个规律,同一场试卷里不同模块的题目数量是均衡的,所以不用过度押注某一个模块。

5.3 笔试完到面试的衔接准备

笔试通过后,一般一到两周内会收到面试邀约。很多考生把笔试和面试割裂开看待,实际上笔试中的内容就是面试技术面的题库来源。尤其是你在笔试中暴露出的薄弱环节,极有可能就是面试官追问的重点。

我这里说的“暴露”指的是,联想的笔试系统会生成一份详细的成绩报告,包括每一个模块的正确率,HR和面试官能看到你哪个模块答得不好。比如你计算机网络部分正确率偏低,面试官很可能在技术面时重点问你TCP相关的知识,来验证你的真实水平。

所以在笔试结束后,即使你觉得考得还行,也一定要花两天时间把笔试中的错题复盘一遍。特别是把操作系统、计算机网络、数据库这几个模块的错题整理出来,为面试做准备。我当时笔试时有一道关于数据库事务隔离级别的题答错了,面试官第二天就追问了MySQL的默认隔离级别和幻读是如何解决的,这个考点几乎被精准命中。

5.4 关于笔试准备周期的建议

如果你现在距离笔试还有三到四周,时间是非常充裕的。我的建议是把复习拆成三个阶段:第一周主攻计算机基础,吃透操作系统、计算机网络和数据库的核心知识点,通过选择题刷题巩固记忆;第二周主攻算法和数据结构,按照数组、字符串、链表、栈队列、二叉树、动态规划的顺序过一遍高频题型的解法,确保简单和中等难度的题能在半小时内写出完整代码;第三到第四周做整套真题模拟,严格按照120分钟的时限,模拟真实考试环境,训练时间分配的节奏感。

如果只剩一周,那就要有取舍了。优先保证选择题里操作系统、网络、数据库这三个拿分大户的准确率,编程题集中练习最简单的数组遍历和字符串处理类题目,确保每道题至少能写出暴力解法拿到一部分分数。至于动态规划这类需要积累的题型,短时间内突击的性价比不高,不如把基础分拿稳。

说到底,联想秋招的笔试更像一面镜子,它照出的是你计算机基础功底的扎实程度,而非刷题量的多少。我在笔试现场最大的感受就是:多数题目其实并不难,但覆盖面很广,任何一个模块有空白都会被精准测出来。所以与其纠结押题,不如把所有基础知识点老老实实过一遍,把每道编程题都当成一次真实的工程任务来对待,这样无论题目怎么变,你都能稳得住。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询