ARTICLE DETAIL

资讯详情

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

乐视暑期实习生笔试题复盘:数据结构、动态规划与系统设计要点解析

乐视暑期实习生笔试题复盘:数据结构、动态规划与系统设计要点解析 去年整理移动硬盘翻出一个命名为“201703_笔试记录”的文件夹里面存着我当年考完乐视暑期实习生笔试后趁记忆新鲜写下来的复盘文件名就叫“乐视2017暑期实习生笔试题一”。那场笔试在三月下旬的机房进行考试倒计时在屏幕右上角跳得人心慌选择题、编程题、简答题三块内容塞在90分钟里节奏稍慢就会写不完。我之所以把这份复盘保留了这么久是因为那套题基本涵盖了当年互联网公司统一笔试的典型出题思路数据结构与算法选择题打底两道编程题考硬功夫再加一道设计简答题看综合能力。本文不保证和当年原卷逐字一致但结合同场同学的回忆和后续面试官反馈整体结构还原度很高。无论你是准备暑期实习校招还是单纯想年看一套有代表性的笔试长什么样这份拆解都值得花十分钟过一遍。1. 这场笔试的试卷结构与三个容易被忽略的细节1.1 整卷构成与时间分配乐视2017暑期实习生笔试题一的总时长是90分钟一共是三个模块选择题、编程题、简答设计题。我根据当时的记忆和同考场几个同学的对照整理出下面的结构模块题目数量建议用时主要考察方向选择题20题左右30分钟Java/C基础、数据结构、计算机网络、操作系统编程题2题35分钟字符串处理、动态规划、常见算法模板简答设计题1题25分钟系统设计思路、业务场景方案这个分值分布很典型选择题占据将近一半的卷面时间但单题分值并不高。很多人容易犯一个错误在前面选择题上死磕结果编程题只剩十几分钟连编译都来不及。我记得考场上坐我隔壁的同学交卷时编程题白卷选择题倒是改了三遍这就是典型的节奏失控。1.2 “一”的潜台词同一招聘季通常有好几套卷标题里的“一”不是随便加的后缀。当年乐视暑期实习生的笔试分为多场第一场之后还有补录场和不同技术方向的专场试卷是并行出的多套。第一套题往往承担着“筛选基数”的任务所以题目整体偏基础、偏套路不会刻意出偏题怪题。后面几场反而出现过难度波动很大的情况因为第一轮已经筛掉了一批人补录名额少题会更硬核。这一点对备考很有参考价值如果你投的是同一个公司的第一批笔试重基础、重熟练度、重速度如果你被安排到补录批则要做好遇到进阶题的心理准备别指望靠背模板就能过关。1.3 笔试环境的硬件细节另外有个细节值得提醒后来的考生机考环境不一定是自己平时熟悉的编译器。乐视这场用的是第三方在线笔试平台代码编辑器没有自动补全也没有代码格式化缩进全靠自己手动调。而且编程题允许的语言和本地环境不完全一致Java版本是1.8C编译器是GCC 4.8左右不支持C17特性。我建议所有人在考前一定去笔试平台官方提供的模拟环境里跑一遍Demo尤其是那些平时只在自己IDE里写代码的同学。单是“没有自动补全”这一点就足以让第一次用的人速度掉三成。2. 选择题里的高频考点与考场止损策略2.1 数据结构题栈、队列与二叉树遍历是主菜选择题第一梯队一定是数据结构。考后和同场同学对过答案出现频率最高的是三类题栈和队列的出入顺序问题包括中缀表达式转后缀表达式二叉树前序、中序、后序遍历的互相推演链表操作的时间复杂度判断中缀表达式转后缀表达式这类题只要熟练操作符优先级和栈的压入弹出规则基本是送分题。但考场上紧张状态下容易把一个细节搞错括号的处理。我总结的口诀是“左括号直接入栈右括号弹到左括号为止”这两个规则必须背到形成肌肉记忆。二叉树遍历题是另一种容易翻车的题型。比如给你前序遍历和中序遍历求后序遍历。做法是先找根节点再用中序序列切分左右子树递归推进。我考场上把这道题的步骤写在了草稿纸上画了三层树图才确定答案。这里想提醒大家选择题允许草稿纸别全靠心算手推两步可以帮你避免至少一半的粗心错误。2.2 计算机网络与操作系统背住就能拿分的题目网络题里TCP三次握手几乎是必考常见问法是“第三次握手发送的包是什么状态”。这里记得SYN1、ACK1确认号是对方的序列号加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) { DequeCharacter 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状态”“贪心失效”统计自己的薄弱点分布第三在接下来一周内针对排名前三的薄弱点做专项刷题。这个方法我一直沿用到了后来的面试准备阶段比闷头刷题高效很多。如果你现在正在准备实习生笔试不妨就用这“一”套代表性真题作为基准先测出自己的薄弱点分布再决定接下来两周的突击方向。我自己的体会是很多笔试失利不是因为知识储备不够而是因为节奏、心态和应试习惯这些“软技能”出了问题。这套题里选择题判断栈的行为、编程题用栈消除相邻重复、设计题拆解短链接服务本质上都在考同一个能力面对一个具体问题时能不能快速抽象出合适的模型并落地实现。这个能力光靠看攻略练不出来必须自己在限时环境下反复淬炼。如果你手头也有一套旧真题别只当回忆看按上面的方法重新做一遍、复盘一遍收获会比你想的大很多。
返回列表