ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

搜狐校招研发工程师笔试题解析:知识点权重与避坑指南

搜狐校招研发工程师笔试题解析:知识点权重与避坑指南 搜狐2017校招研发工程师模拟笔试题二我当年是在秋招开始前的暑假刷到的。那时候刚刷完整一轮牛客网的选择题以为自己基础还行结果这套模拟题第一遍做下来选择题错了一小半编程题有一道直接没思路。后来反复刷了两遍又对照答案整理了一遍知识点才慢慢摸清楚这类笔试题的出题套路。这篇文章就把我当时拆解这套模拟题的思路、考点权重、做题顺序和踩过的坑一次性分享出来给正在准备校招研发岗的同学做个参考。先说清楚这套题适合谁。如果你是大三、研二准备参加秋招的同学或者已经投了互联网公司但笔试挂了几次想复盘再或者你只是想系统测一下自己的计算机基础到底扎不扎实这套模拟题都值得认真做一遍。它不追求偏题怪题考的都是研发工程师日常必须掌握的东西数据结构、算法、操作系统、计算机网络、语言基础再加一两道手写代码题。它解决的是“我到底哪里不行”这个问题比埋头刷几十道难题更有诊断价值。1. 这套模拟题的价值在哪里先搞清楚怎么用1.1 笔试题的结构与定位先说结论搜狐2017校招研发工程师模拟笔试题二整体风格是“广度优先基础为王”。它不是那种靠一道压轴难题区分所有人的卷子而是用大量选择题快速筛掉基础不牢的人再用编程题筛掉动手能力不行的人。我当时拿到卷子第一感觉是内容真杂。选择题里既有链表反转、二叉树遍历这种数据结构题也有进程线程区别、TCP三次握手这种操作系统和网络题还有不少C/C和Java的语言细节题。这种结构其实和当年大多数互联网公司的笔试风格是一致的。研发工程师岗位不需要你做题做到竞赛水平但要求你在大学四年学的核心专业课里没有明显的短板。1.2 适合谁来刷怎么刷收益最大我建议你把这套模拟题当“体检报告”来用而不是当“练习题”。第一遍做的时候严格计时模拟真实笔试环境做完先别急着看答案把每道题对应的知识点写下来。比如这道题考的是“二分查找边界”那道题考的是“死锁四个必要条件”。然后重点来了不要只订正错题要做“考点归类”。我当时把错题分成三类第一类是“知识没学过”——比如我还真没系统复习过数据库的索引底层结构第二类是“学过但忘了”——比如页面置换算法LRU第三类是“会但做错了”——比如快排最坏时间复杂度明明知道是O(n²)考试时一紧张选了O(nlogn)。三种错题复习策略完全不同第一种需要补课第二种需要反复记忆第三种需要警惕粗心。这套模拟题能做好的话后面正式笔试心里会很有底。2. 题型分布与知识点权重拆解2.1 选择题基础知识的覆盖面这套模拟题的选择题大概覆盖了下面几个模块权重我根据自己做题的感受和当年互联网校招的普遍情况整理成了表格。注意这个比例不是官方数据是我和其他刷过题的同学交流后的经验值供你安排复习时间时参考。知识点模块大概占比典型考点数据结构与算法30%链表、栈队列、二叉树、排序、查找、复杂度操作系统15%进程线程、死锁、内存管理、页面置换计算机网络15%TCP/UDP、HTTP、DNS、三次握手四次挥手语言基础C/C/Java20%static、指针、引用、String、垃圾回收数据库10%索引、事务ACID、SQL基础其他设计模式、Linux命令等10%单例模式、常见Linux指令、编译链接这个权重说明了两个问题。第一数据结构与算法是绝对的重头戏不论选择题还是后面的编程题这部分都是制胜关键。第二语言基础占比很高而且考得很细。我在C/C的static关键字上栽过跟头它既能修饰变量又能修饰函数修饰局部变量时延长生命周期修饰全局变量时限制作用域这种细节题光靠背结论是不够的得真正理解编译器和链接器的行为。2.2 编程题真正的分水岭选择题大家差距往往不大因为都是基础考点。真正拉开差距的是后面的编程题。这套模拟题的编程题我当时印象很深题目本身不刁钻但考察的是“在限定时间内又快又对地写出来”的能力。编程题大致分两类。第一类是“手熟型”题目比如反转链表、判断字符串是否是回文、求二叉树最大深度。这类题一看就知道思路但容易在边界条件上翻车。第二类是“思路型”题目比如动态规划里的经典模型、搜索问题需要你现场推导状态转移方程。我当时就栽在一道动态规划上想了十分钟没思路果断先跳过做后面的题最后留了十分钟再回头才用暴力解法拿了一部分分数。这个策略在后面展开讲。2.3 简答题和概念题的隐含考点别以为只有选择题和编程题这套模拟题里还有少量概念性题目考的是“能不能用大白话讲清楚一个概念”。比如让你解释进程和线程的区别你光说“进程是资源分配的最小单位线程是CPU调度的最小单位”还不够最好能补一个例子进程像一栋楼线程像楼里的住户楼是大家共享的资源主体住户是真正活动的人。这类题其实考察的是理解的深度面试时也经常被追问。3. 高频考点逐个击破数据结构和算法篇3.1 排序与查找必考但容易翻车排序是这套模拟题的重灾区也是我在复习时最先补齐的知识点。你至少要能手写冒泡、快排、归并、堆排序这四种常用排序并且能说出它们的时间复杂度、空间复杂度和稳定性。这里有一个我当年总结的表格背下来能解决大部分排序选择题排序算法平均时间复杂度最坏时间复杂度空间复杂度稳定性冒泡排序O(n²)O(n²)O(1)稳定快速排序O(nlogn)O(n²)O(logn)不稳定归并排序O(nlogn)O(nlogn)O(n)稳定堆排序O(nlogn)O(nlogn)O(1)不稳定别小看这张表笔试经常考“以下哪个排序算法是不稳定的”或者“快排在什么情况下退化成O(n²)”。我当时就错在没记住“稳定性”这个概念本身——它指的是值相等的元素排序后相对顺序是否保持不变。对了快排退化的原因是每次选的基准值都恰好是最大或最小值导致分割极度不平衡所以有些快排实现会做三数取中优化。二分查找也是必考点但它最阴险的地方在于边界条件。我建议你自己手写一遍左闭右闭的写法然后对照左闭右开写法搞清楚while循环条件到底是left right还是left right以及mid到底是向下取整还是向上取整。当年我就因为把mid (left right) 1写成了mid (left right) / 2踩了坑后者在极端情况下可能整型溢出。3.2 链表与树手写代码的重灾区链表题在选择题和编程题里都频繁出现。核心考点就几个反转链表、判断是否有环、找中间节点、删除指定节点。这里的难点不是思路而是指针操作容易乱。建议你画图辅助画清楚prev、cur、next三个指针的移动过程再动手写代码。反转链表有一个很稳的写法在纸上先画出每一步的指针指向再翻译成代码。我当时总结了六个字先存后指再移。每次循环先保存当前节点的下一个节点再把当前节点指向前驱最后移动前驱和当前指针。笔试现场没有IDE辅助调试这种套路越机械越不容易错。树的考点也很集中前序、中序、后序、层序遍历。递归写法是基础必须信手拈来但你还要会非递归写法因为笔试经常考“用栈实现二叉树中序遍历”。层序遍历用队列这个也要熟练掌握。二叉树的最大深度、判断是否平衡二叉树、最近公共祖先这几个问题我建议你整理成模板考前背熟。这套模拟题里的二叉树题目基本都是这个难度不会考红黑树那种级别的数据结构细节。3.3 动态规划与贪心怎么识别题型动态规划是很多人的噩梦也是这套模拟题里编程题的压轴方向。我的经验是拿到一道题先看它能不能拆成更小的子问题并且子问题之间有重叠。如果能大概率是动态规划如果每一步都选局部最优就能得到全局最优那就是贪心。几个经典的动态规划模型一定要练熟斐波那契数列最简单的动规入门、爬楼梯一次可以爬1阶或2阶、最长公共子序列、01背包、编辑距离。以爬楼梯为例状态转移方程是dp[i] dp[i-1] dp[i-2]如果你连这个都推不出来笔试现场基本只能放弃。我当时用了一个笨办法把所有常见动规模型都在本子上推导了两遍先自己想递推关系再看答案修正然后不看答案自己写一遍。这样虽然慢但上考场遇到变形题不容易慌。4. 操作系统、网络与语言基础选择题的得分盘4.1 操作系统进程线程、内存管理操作系统这块的选择题我认为是整套卷子里“性价比”最高的部分因为它知识点固定考来考去就那几样。进程和线程的区别、并发与并行、死锁的四个必要条件互斥、占有并等待、非剥夺、循环等待、线程间同步方式互斥锁、信号量、条件变量这些必须滚瓜烂熟。内存管理也是高频区。虚拟内存、分页分段、页面置换算法FIFO、LRU、LFU这几个概念要能说出来各自的特点和适用场景。我当年在LRU和LFU上纠结过LRU是“最近最久未使用”看的是时间LFU是“最近最不经常使用”看的是使用频率。笔试题会给你一串访问序列让你判断缺页次数这种题只要画表就能解但一定不要心算。4.2 计算机网络TCP/IP高频题计算机网络选择题基本围绕TCP/IP协议族展开。TCP的三次握手和四次挥手每次交互的状态迁移SYN_SENT、SYN_RCVD、ESTABLISHED、FIN_WAIT等要能默写出来。TCP和UDP的区别也是必考题TCP是面向连接的可靠传输UDP是无连接的不可靠传输但UDP头更小、延迟更低所以视频通话、DNS查询这类场景都用UDP。HTTP也是常见考点。状态码分类要记牢2xx成功、3xx重定向、4xx客户端错误、5xx服务端错误。其中404是资源不存在502是网关错误这两个我在笔试里被考过不止一次。DNS解析流程偶尔也会出现比如输入一个网址后从浏览器缓存、操作系统缓存、本地DNS服务器、根DNS服务器一路查下来这个过程要能说出来。当时这套模拟题里就有一道关于TCP和UDP适用场景的选择题我错在把HTTP当作基于UDP的协议实际上HTTP基于TCP。4.3 C/C与Java语言细节语言基础题考得非常细纯粹是“平时写代码时有没有留神”。C/C里的指针和引用、static和const的作用、内存申请与释放、malloc和new的区别这些都是老熟人。有一道我印象特别深的题给一段C代码让你判断有几个变量在堆上、几个在栈上如果你平时没用过valgrind之类的工具观察过内存分布很容易选错。Java方面String、StringBuilder、StringBuffer的区别是万年老题。String是不可变类每次拼接都会产生新对象StringBuilder是线程不安全的可变类但性能最好StringBuffer加了同步锁线程安全但性能略差。还有equals和的区别equals比较的是内容比较的是引用地址但Integer在-128到127之间有缓存这个坑面试笔试都爱考。另外Java垃圾回收机制的基本思路——可达性分析、GC Roots、新生代老年代也要能说个大概。5. 实战演练典型题型的解题套路5.1 典型编程题的标准解题流程我给你演示一下我当时做完这套模拟题后的复盘过程重点不在题目本身而在“如何一步步把题目解出来”这个思维路径。就以最常见的“判断一个字符串是否是回文字符串”为例展开。拿到题先不写代码。第一步明确输入输出输入是字符串输出是布尔值。第二步想边界条件空字符串算不算回文单字符字符串一定算回文吧如果字符串包含空格、标点和大小写怎么办第三步选择解法最简单的是双指针法一个从左边走一个从右边走一旦发现字符不相等就直接返回false直到两个指针相遇。第四步写代码时注意判断条件的细节比如while (left right)还是while (left right)左右指针到底什么时候移动。我当时复盘时发现很多编程题写不对根本不是思路问题而是边界条件没考虑全。比如反转链表时如果链表为空或者只有一个节点不用反转直接返回即可这往往是笔试时最容易丢分的地方。建议你养出一个习惯代码写完先检查三件事——空输入、单元素输入、超长输入。5.2 时间分配与做题顺序建议这套模拟题的做题顺序我强烈建议“先编程题后选择题”。因为选择题量大且分值分散如果你前面磨蹭太久后面编程题时间不够劣势很大。我当时的时间分配策略是这样的先花3-5分钟快速通读整张卷子确认编程题有几道、大概考的什么方向。如果发现有思路的编程题立刻动手做如果没有思路先跳过把后面所有选择题做完再回头。选择题靠积累和排除法通常做得比较快。编程题每道最多给自己20分钟超时还写不出完整解法就用暴力解法保底先拿到部分分再说。笔试和面试一样优先保证能拿到的分都拿到而不是纠结一道难题。另外选择题里不确定的题目我建议先标记出来不要卡太久。很多求职者为了某道“好像见过”的题死磕十分钟结果后面有道送分题没时间做这很可惜。做完之后再根据剩余时间决定是否回头推敲。6. 常见问题与避坑指南6.1 刷题的三个典型误区误区一是只看不写。这是我见过最多的通病尤其在看别人博客或者题解时一看就会一写就废。笔试编程题考的是手写代码能力不是看代码能力。我建议每道编程题都新建一个文本文件开着记事本写不要用IDE的自动补全因为笔试环境往往比较简陋。平时习惯了IDE补全考场上一换环境连头文件都写不全更别提算法了。误区二是不整理错题。刷了一遍当然会有错题但大多数人是“对完答案就完事”下次遇到同类题照样错。我当时做了个Excel表把每道错题的知识点、错误原因、正确答案、同类题变形都记下来隔一周再遮住答案重新做一遍。这个方法看着费时间但对提升正确率非常有效。误区三是背题而不懂原理。这套模拟题里有一道关于线程同步的选择题如果你只记住“synchronized是Java的同步关键字”不理解它底层用的是监视器锁那题目稍微一变形你可能又答错。笔试的目的不是让你背住这道题的答案而是检验你是否真的理解背后的原理。所以复习时多问自己几次“为什么”把结论背后的机制搞清楚。6.2 笔试现场的几件事要提前准备首先是环境准备。如果你是线上笔试提前一天检查网络、摄像头、键盘和浏览器兼容性这些细节非常影响心态。我当时遇到过做题做到一半断网的惨剧重连后虽然有补时但思路已经被打断了。线上笔试对答题体验的影响比很多人想象的大得多。其次是心态管理。遇到不会的题很正常。这套模拟题我在第一遍做的时候有一道关于死锁的编程题毫无头绪最后直接空着提交了。后来复盘才发现它不是考你写一个复杂的加锁顺序而是考你能不能判断“这段代码有没有死锁风险”。所以提醒各位看到陌生的题型先深呼吸仔细把题读三遍很多题就是唬人真正的考点其实很基础。最后是老生常谈的边界问题。笔试题里的编程题判分基本以“是否正确处理各种情况”为标准不会因为你写了一坨漂亮的代码就多给分。所以无论如何先把功能完整的代码写出来再去想优化。我在刷这套模拟题的时候最大的收获不是“我刷完了很多题”而是第一次意识到自己的基础知识有这么多的漏洞。它像一面镜子把我不熟悉的操作系统知识点、容易搞混的排序稳定性、写代码时粗心的边界情况全部照了出来。如果你也准备走研发工程师这条路不用把刷题当成任务而是当成一次对自己知识体系的体检。这套模拟题做完把错题整理透了再去做其他公司的笔试题你会明显感觉到轻松不少。
返回列表