去年整理移动硬盘,翻出一个命名为“201703_笔试记录”的文件夹,里面存着我当年考完乐视暑期实习生笔试后趁记忆新鲜写下来的复盘,文件名就叫“乐视2017暑期实习生笔试题(一)”。那场笔试在三月下旬的机房进行,考试倒计时在屏幕右上角跳得人心慌,选择题、编程题、简答题三块内容塞在90分钟里,节奏稍慢就会写不完。
我之所以把这份复盘保留了这么久,是因为那套题基本涵盖了当年互联网公司统一笔试的典型出题思路:数据结构与算法选择题打底,两道编程题考硬功夫,再加一道设计简答题看综合能力。本文不保证和当年原卷逐字一致,但结合同场同学的回忆和后续面试官反馈,整体结构还原度很高。无论你是准备暑期实习校招,还是单纯想年看一套有代表性的笔试长什么样,这份拆解都值得花十分钟过一遍。
1. 这场笔试的试卷结构与三个容易被忽略的细节
1.1 整卷构成与时间分配
乐视2017暑期实习生笔试题(一)的总时长是90分钟,一共是三个模块:选择题、编程题、简答设计题。我根据当时的记忆和同考场几个同学的对照,整理出下面的结构:
| 模块 | 题目数量 | 建议用时 | 主要考察方向 |
|---|---|---|---|
| 选择题 | 20题左右 | 30分钟 | Java/C++基础、数据结构、计算机网络、操作系统 |
| 编程题 | 2题 | 35分钟 | 字符串处理、动态规划、常见算法模板 |
| 简答设计题 | 1题 | 25分钟 | 系统设计思路、业务场景方案 |
这个分值分布很典型,选择题占据将近一半的卷面时间,但单题分值并不高。很多人容易犯一个错误:在前面选择题上死磕,结果编程题只剩十几分钟,连编译都来不及。我记得考场上坐我隔壁的同学,交卷时编程题白卷,选择题倒是改了三遍,这就是典型的节奏失控。
1.2 “(一)”的潜台词:同一招聘季通常有好几套卷
标题里的“(一)”不是随便加的后缀。当年乐视暑期实习生的笔试分为多场,第一场之后还有补录场和不同技术方向的专场,试卷是并行出的多套。第一套题往往承担着“筛选基数”的任务,所以题目整体偏基础、偏套路,不会刻意出偏题怪题。后面几场反而出现过难度波动很大的情况,因为第一轮已经筛掉了一批人,补录名额少,题会更硬核。
这一点对备考很有参考价值:如果你投的是同一个公司的第一批笔试,重基础、重熟练度、重速度;如果你被安排到补录批,则要做好遇到进阶题的心理准备,别指望靠背模板就能过关。
1.3 笔试环境的硬件细节
另外有个细节值得提醒后来的考生:机考环境不一定是自己平时熟悉的编译器。乐视这场用的是第三方在线笔试平台,代码编辑器没有自动补全,也没有代码格式化,缩进全靠自己手动调。而且编程题允许的语言和本地环境不完全一致,Java版本是1.8,C++编译器是GCC 4.8左右,不支持C++17特性。
我建议所有人在考前一定去笔试平台官方提供的模拟环境里跑一遍Demo,尤其是那些平时只在自己IDE里写代码的同学。单是“没有自动补全”这一点,就足以让第一次用的人速度掉三成。
2. 选择题里的高频考点与考场止损策略
2.1 数据结构题:栈、队列与二叉树遍历是主菜
选择题第一梯队一定是数据结构。考后和同场同学对过答案,出现频率最高的是三类题:
- 栈和队列的出入顺序问题,包括中缀表达式转后缀表达式
- 二叉树前序、中序、后序遍历的互相推演
- 链表操作的时间复杂度判断
中缀表达式转后缀表达式这类题,只要熟练操作符优先级和栈的压入弹出规则,基本是送分题。但考场上紧张状态下,容易把一个细节搞错:括号的处理。我总结的口诀是“左括号直接入栈,右括号弹到左括号为止”,这两个规则必须背到形成肌肉记忆。
二叉树遍历题是另一种容易翻车的题型。比如给你前序遍历和中序遍历,求后序遍历。做法是先找根节点,再用中序序列切分左右子树,递归推进。我考场上把这道题的步骤写在了草稿纸上,画了三层树图才确定答案。这里想提醒大家:选择题允许草稿纸,别全靠心算,手推两步可以帮你避免至少一半的粗心错误。
2.2 计算机网络与操作系统:背住就能拿分的题目
网络题里,TCP三次握手几乎是必考,常见问法是“第三次握手发送的包是什么状态”。这里记得SYN=1、ACK=1,确认号是对方的序列号加1。另一个出现频率很高的考点是HTTP状态码区别,尤其是301和302、401和403这两组。
- 301是永久重定向,302是临时重定向
- 401是未认证,403是禁止访问
如果你把这两组背混了,选择题直接扣分。我自己的方法是每天用十个状态码做一次快速自测,连续三天就不会再错。
操作系统方面,进程与线程的区别、死锁的四个必要条件、虚拟内存的分页机制基本是三选二必考。死锁条件就是互斥、持有并等待、不可剥夺、循环等待,这四个词需要能完整默写,因为简答题也可能用到。
2.3 选择题的止损策略:单题最多三分半
我的建议是:选择题单题卡超过三分半,直接放过,在题目序号上标注一个“?”,有时间再回头算。这套题整体难度不算高,但有些读起来很长的网络场景题会消耗大量时间。
我记得有一道关于子网掩码的题目,题干给了四个网络地址,问哪两个属于同一子网。这类题说起来不难,但需要把IP转成二进制逐位比较,很费时间。考场上我的处理方式是先跳过,等编程题做完后再回来补,最后还剩五分钟把它推了出来。如果当时在前面恋战,编程题大概率要没时间写。
3. 编程题的主攻方向:字符串处理与最优化问题
3.1 第一道编程题:字符串类问题的破局点
编程题第一道考的是字符串去重变体:给定一个字符串,删除所有相邻的重复字符,直到没有相邻重复字符为止。这类题和“连连看”的思路很像,核心点是删除一对相邻字符后,新产生的相邻关系也要继续处理。
举个例子:输入“aabccc”,先删除“aa”得“bccc”,再删除“cc”得“bc”,所以答案是“bc”。如果只是遍历一次删除,就会漏掉删除“cc”后的情况。正确解法是用栈:
public static String removeDuplicates(String s) { Deque<Character> stack = new ArrayDeque<>(); for (char c : s.toCharArray()) { if (!stack.isEmpty() && stack.peek() == c) { stack.pop(); } else { stack.push(c); } } StringBuilder sb = new StringBuilder(); while (!stack.isEmpty()) { sb.append(stack.pop()); } return sb.reverse().toString(); }考后我发现一个很多人踩的坑:直接用字符串替换函数循环处理,比如把“aa”替换成空字符串,直到结果不再变化。这种方式在字符串很长时性能极差,而且如果替换过程中出现“aaaa”这种连续四个相同字符的情况,处理顺序会直接影响结果。用栈的唯一好处就是时序天然正确,左到右扫一遍,相邻相同则抵消,和“祖玛游戏”的核心机制一样。
从这道题能看出,乐视这套笔试题选编程题很讲究实用性,没有上来就甩一个很难的最短路,而是用一道“规则不复杂但边界不好处理”的题目来考验基本功。这类题在LeetCode上能找到大量同类题,刷题时建议按“栈模拟”标签集中刷一遍。
3.2 第二道编程题:最优化问题里藏着动态规划
第二道编程题是典型的背包变体:给定一组硬币面值和一个目标金额,问组成目标金额的最少硬币数。这道题现在看是动态规划入门题,当年却把不少参赛者难住了,因为很多人第一反应是贪心。
贪心在部分面值组合下能通过示例,比如{1, 2, 5}组成11元,用最大面值贪心可以得3枚,恰好正确。但换一组面值{1, 3, 4}组成6元,贪心会先取4、再取1、再取1,结果是3枚硬币,而正确解是取两个3,只要2枚。这就是经典的“贪心失效”案例。
动态规划状态转移非常直接:
public int coinChange(int[] coins, int amount) { int[] dp = new int[amount + 1]; Arrays.fill(dp, amount + 1); dp[0] = 0; for (int i = 1; i <= amount; i++) { for (int coin : coins) { if (coin <= i) { dp[i] = Math.min(dp[i], dp[i - coin] + 1); } } } return dp[amount] > amount ? -1 : dp[amount]; }dp[i]表示组成金额i所需的最少硬币数。每到一个金额,遍历所有面值,看从i-coin这个状态再放一枚coin能不能更优。
这里想强调一个笔试高频思维:遇到“最少/最大/多少种方案”这类最优化问题,先想贪心能不能证明正确,不能证明就立刻切到动态规划。考场上写一个无法证明的贪心,就算通过了示例,后台测试数据也很容易把你卡死。动态规划虽然代码看起来多几行,但是可验证、可解释,哪怕时间不够没跑通全部用例,至少思路分能拿到。
3.3 笔试编程题里最容易被扣分的输入输出细节
编程题的双重坑点之一:输入格式。当年的笔试平台有些编程题要求处理多组测试数据,也就是说你不应该只读一行就结束程序,而是需要循环读取到输入结束。用Java的时候,我习惯写法是:
Scanner scanner = new Scanner(System.in); while (scanner.hasNext()) { String line = scanner.nextLine(); // 处理每一行 }如果漏掉while循环,只处理一组数据,后台用例最多只能过一个,几乎等于白写。这类问题在你平时刷LeetCode时不会遇到,因为LeetCode已经封装好了方法调用,但企业笔试和ACM模式一脉相承,必须自己处理输入输出。
另一个坑是输出格式:控制台输出的空格和换行必须严格匹配要求。题目说每个答案占一行,你就必须换行;说每个数字之间用空格隔开,你就不能在末尾多打一个空格。这些判断如果靠人眼是看不出来的,但后台比对程序会判错。
我在考场上写完硬币问题的核心函数后,专门花了三分钟检查输出逻辑:第一,循环读取输入;第二,格式化成一行一个数字;第三,最后是否需要输出一个空行。这三个检查点建议作为你笔试编程题的固定收尾动作,比反复优化算法更值钱。
4. 简答设计题里,面试官真正想看的答题维度
4.1 设计题的题干模式与破题框架
简答设计题的题干大致是:设计一个支持高并发的短链接服务,要求给出核心流程、存储方案和可能的瓶颈。
这种题在校招笔试里非常常见,它不只考你会不会写代码,更考你对一个完整系统的拆解能力。当年和我一起复习的同学里,有人把这类题当成“背答案”题,背了一堆高可用、负载均衡的名词就往上写,结果分数并不高。复盘之后我发现,面试官想看的不是名词,而是你有逻辑地分点表达的能力。
我的答题框架是四段式:
- 需求拆解:明确短链接生成的原理(原链接与短码映射)
- 核心流程:客户端请求、生成短码、存储映射、重定向
- 存储选型:用什么存映射关系,为什么
- 瓶颈分析:短码生成的发号器有没有单点、存储容量怎么估算
这四段写下来,大概需要80到120个字的核心描述加一张简陋但逻辑清晰的图。不需要画得好看,但要让人一眼看懂请求的流转方向。
4.2 好答案和差答案的分水岭:存储方案的选择理由
很多人写存储时会写“用MySQL存映射关系”,但不说为什么。如果你能补上这句“短链接服务读多写少,主要操作是通过短码查原链接,MySQL用主键索引查单行绰绰有余”,就已经超过一半人了。
如果你还能再进一步,说“短码可以直接用发号器生成自增ID转换为62进制,也可以用哈希截断加冲突校验”,那这道题的分数基本就握在手里了。
我考场上没写哈希方案,也没有展开62进制,只写了“MySQL + 自增ID + 短码映射表 + 缓存热点数据”。因为实在没时间了。但事后复盘,在25分钟里完整覆盖这四段框架,时间是足够用的,关键是你必须养成条件反射式的答题结构,看到任何设计题都按这个套路推进。
4.3 设计题的时间管理:别让画图吃掉答题时间
这里有一个非常现实的教训:设计题容易在画图上失控。我见过有人花十五分钟画了一张带虚线、实线、红蓝标注的架构图,结果旁边对存储方案的描述只有一行字。这种本末倒置非常致命。
我的建议是先写完文字,再画示意图。图上只要画出主要模块和箭头方向就行,颜值不重要。而且别在图上纠结用什么画图工具,在线笔试平台的答题框一般只能写纯文本,画不了真正意义上的图,那就用ASCII字符箭头或编号列表表达模块关系,比如:
- 客户端请求
- 网关层 -> 短码生成服务
- 落库 -> 返回短链接
- 客户端访问短链接 -> 查询映射 -> 301跳转
这样的纯文本描述一样能拿分,而且排列清楚,面试官扫一眼就能看懂。这条经验特别适用于各类有文本答题限制的笔试平台。
5. 用这套题复盘,反推当前实习生笔试的准备路径
5.1 不要被“公司滤镜”干扰对难度判断
这套题现在看起来难度属于中等偏基础,但在当年那个时间点,很多应聘者是被“乐视”这个品牌吸引过去的,心理预期很高,结果看到试卷后反而有点落差。这种心态会影响发挥——你以为会考特别前沿的东西,结果全是基础题,于是掉以轻心,在简单题上失误。
我复盘时的结论是:任何一场笔试,难度分布都和公司当下的招聘节奏强相关。早期批次往往题目常规,是为了快速筛出可培养的人;补录批则可能因为名额少而提高难度。所以你不能只刷难题,也不能只刷基础题,最好按“基础+进阶”两条线并行推进。
5.2 一套可复用的90分钟笔试节奏模型
从这套题开始,我在之后的每次笔试前都会给自己定一个时间模型,考场上照着执行:
- 前3分钟:快速浏览全卷,标记编程题难度和设计题主题
- 选择题:每题控制在1分半以内,整块最多35分钟
- 编程题:先做有思路的那题,保底拿下一个;另一题写核心函数,尽力拿部分分
- 设计题:至少留出20分钟,按框架写文字,不纠结画图
这个模型帮我扛过了后来几乎所有公司的笔试。关键在于不要被单题卡住,全局得分率才是你能否进面试的关键。
5.3 模拟笔试的重要性与具体做法
很多人平时刷题是“打开IDE,写代码,跑过示例就关掉”,这种练习方式和企业笔试的差距很大。企业笔试考的是你在限时、无补全、多组输入、环境陌生的条件下,能不能稳定输出。
我后来备考时,每周至少做两场全真模拟:用笔试平台自带模拟环境,计时90分钟,选择题和编程题都做。开始时很不适应,常常到点还差一大半没写,但连续练了三场后,节奏感就出来了,到第四场已经能稳定在铃声响起前五分钟检查完所有题目。
这里的要点是:模拟时必须严格按正式笔试的操作流程来,不要中途切出去搜资料,不要暂停计时。平时放松一次,考场上可能就意味着做不完。
5.4 考后复盘比刷一套新题更重要
这套乐视笔试题给我最大的收获,并不在于它的具体题目,而是我被迫在考后做了两小时复盘。
复盘的具体操作可以分三步:第一,把每道错题和蒙对的题都标注出来,重做一遍;第二,把错题背后的知识点归入一个Excel表,比如“二叉树遍历”“TCP状态”“贪心失效”,统计自己的薄弱点分布;第三,在接下来一周内针对排名前三的薄弱点做专项刷题。
这个方法我一直沿用到了后来的面试准备阶段,比闷头刷题高效很多。如果你现在正在准备实习生笔试,不妨就用这“一”套代表性真题作为基准,先测出自己的薄弱点分布,再决定接下来两周的突击方向。
我自己的体会是,很多笔试失利不是因为知识储备不够,而是因为节奏、心态和应试习惯这些“软技能”出了问题。这套题里选择题判断栈的行为、编程题用栈消除相邻重复、设计题拆解短链接服务,本质上都在考同一个能力:面对一个具体问题时,能不能快速抽象出合适的模型并落地实现。这个能力光靠看攻略练不出来,必须自己在限时环境下反复淬炼。如果你手头也有一套旧真题,别只当回忆看,按上面的方法重新做一遍、复盘一遍,收获会比你想的大很多。