尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

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

搜狐2017秋招研发工程师笔试解析:考点分布与备考策略

搜狐2017秋招研发工程师笔试解析:考点分布与备考策略 很多刚准备秋招的同学问我搜狐这种老牌互联网公司的研发工程师笔试试卷到底在考什么尤其是网上流传的“搜狐2017秋招研发工程师笔试试卷二”和第一批试卷相比有哪些侧重。我当年刷过这份卷子也帮学弟学妹做过好几轮复盘今天干脆把这份卷子涉及的核心考点、答题思路、容易踩的坑一次性说清楚。无论你是正在备战大厂校招还是想看看自己基础扎不扎实这份拆解都值得认真读一遍。先说明一下这份试卷题型上还是经典的“选择题 简答题 手写代码题”组合选择题覆盖数据结构、操作系统、计算机网络、C/C语言基础简答题偏向Linux操作和场景设计编程题则是算法与数据结构现场手写。整体难度不属于“劝退型”但非常吃基础很多题不是看一眼就能答上来的靠的是平时积累。1. 考完这份卷子我对搜狐笔试考点分布的三个直观感受1.1 不偏不怪但覆盖面非常广搜狐2017秋招研发工程师笔试试卷二最明显的特点就是“不偏不怪”。这里说的“不偏不怪”不是指题目简单而是指所有题目都稳扎稳打来源于计算机专业必修课的核心知识点没有任何脑筋急转弯式的题目。整份卷子的考点大致可以分成四块第一块是数据结构与算法大概占35%到40%重点在链表、树、动态规划、字符串处理第二块是C/C语言细节包括指针、内存管理、关键字语义占20%左右第三块是操作系统与计算机网络占比约20%到25%第四块是Linux操作、数据库、设计模式和系统设计类题目占比约15%到20%。这里就引出一个非常重要的信息搜狐笔试不考特定框架、不考特定业务、不考所谓“前沿技术名词”。像什么“谈谈你对微服务的理解”“什么是容器化”这类问题在当年技术圈已经热门但这套卷子里几乎没有。也就是说秋招笔试阶段基本功永远是最重要的。不要把大把时间花在背框架面经上先把操作系统、网络、数据结构这些基础打牢固才是正事。1.2 选择题里大量题目在考“易混淆概念”第二点感受是这份试卷的选择题部分出题人非常喜欢把容易混淆的概念放在一起考。举个例子C里面“指针数组”和“数组指针”、“指针函数”和“函数指针”这类问题如果不仔细看很容易选错。再比如操作系统的选择题里经常把“进程和线程的区别”“协程和线程的区别”放在选项里让你从中选出不符合的一项。这类题目不要求你写出长篇大论而是考察你是否真正理解概念本质而不只是背了定义。所以备战这类笔试一定要把知识点理解的颗粒度细化到“能准确说出两个概念之间最本质的差异”而不是笼统地说“线程是轻量级进程”。这种出题风格对应试者的启示是复习时要习惯做对比学习。每学一个知识点就问自己几个问题——它和容易混淆的概念有什么区别它解决了什么问题它的局限性在哪一旦养成这种习惯遇到概念辨析题基本不会丢分。1.3 编程题数量不多但综合性强整套试卷的编程题大约有3到4道虽然数量不算多但每一道都不是单纯背模板能解决的。比如链表相关的题目不仅仅考反转而是会加一些限制条件动态规划的题目也不会直接告诉你“用动态规划”而是需要你自己分析出子问题结构。综合性强还体现在另一方面有些题目把多个数据结构揉在一起考。比如既要你用哈希表优化查找又要在查找的基础上维护某种顺序性这时候就需要你对各种数据结构的特性非常熟悉能够根据现场题目要求迅速作出取舍。这种题目做起来很考验思维敏捷度。很多同学平时刷题是“看到题就知道这题属于哪类”但考场上是没有这个提示的。我的建议是做题时先不要急着套模板先把题目场景抽象成数据结构问题想清楚了再动手。2. 算法与数据结构题边界条件和状态设计才是真正的分水岭2.1 链表操作类题目核心是“别绕晕指针”搜狐的算法题里链表题出现的频率非常高。2017秋招研发工程师笔试试卷二中有一道链表相关的编程题不是简单的反转链表而是需要你先判断链表是否有环然后再进行某种操作。这类题目当时让不少考生栽了跟头因为单纯背反转链表的模板根本不够用。链表题的核心难点在于指针操作。我辅导过的学弟学妹中很多人能理解算法思路但一写代码就容易出现访问空指针、死循环、丢节点的问题。这里分享一个非常实用的编码技巧凡是涉及指针变动的操作先画出节点和指针变化图再写代码。以单链表反转为例虽然这是最基础的题目但也是很多进阶题的基础struct ListNode { int val; ListNode *next; ListNode(int x) : val(x), next(nullptr) {} }; ListNode* reverseList(ListNode* head) { ListNode *prev nullptr; ListNode *curr head; while (curr ! nullptr) { ListNode *nextTemp curr-next; curr-next prev; prev curr; curr nextTemp; } return prev; }这段代码的关键点有两个一是在修改curr-next之前必须先用nextTemp保存原来的下一个节点否则链就断了二是循环结束后prev指向原链表的尾节点也就是新链表的头节点。如果你在这个基础上遇到“K个一组反转链表”这种进阶题只需要把上面的逻辑封装成一个函数再递归或者迭代处理每一组即可。但很多人在分组边界上容易出错我的经验是把“一组”的开头和结尾用两个指针明确标出来每次反转前先检查剩余节点是否够一组。2.2 动态规划题目状态定义定了问题就解决了一半搜狐这份试卷中动态规划题也占了一席之地。动态规划在笔试中的重要性不需要我多说但凡稍具规模的互联网公司笔试动态规划基本属于必考项。2017年这套试卷里的动态规划题典型的是类似最长公共子序列或者带条件的路径规划问题。这类题目的通解思路可以梳理成三步。第一步是明确状态定义。这是动态规划里最关键的一步。比如最长公共子序列问题我们把dp[i][j]定义为“字符串A的前i个字符和字符串B的前j个字符的最长公共子序列长度”一旦这个定义清晰了递推公式就顺理成章了。第二步是推导状态转移方程。仍以最长公共子序列为例if (A[i-1] B[j-1]) { dp[i][j] dp[i-1][j-1] 1; } else { dp[i][j] max(dp[i-1][j], dp[i][j-1]); }第三步是确定初始条件和遍历顺序。初始条件一般是dp[0][j] 0、dp[i][0] 0遍历顺序是正序、逐行填充。很多同学在动态规划上失分并不是因为不会转移方程而是因为一开始状态定义就有问题。比如有些题目可以定义一维DP但实际考点是需要两位DP才能容纳足够信息还有一些题目的状态不仅仅是“位置”还包括“剩余操作次数”“当前方向”等额外维度。这时候就体现出平时做题的积累了状态定义的经验是需要大量刷题才能增长的。2.3 字符串处理题目滑动窗口思路能解决一大半问题字符串处理类的题目在搜狐笔试中也经常出现尤其是带有“最长子串”“最少覆盖子串”这类字眼的题目几乎是滑动窗口的天下。这里以“无重复字符的最长子串”为例这是滑动窗口最基础的题目也是笔试中出现频率极高的原题def lengthOfLongestSubstring(s: str) - int: seen set() left 0 max_len 0 for right, ch in enumerate(s): while ch in seen: seen.remove(s[left]) left 1 seen.add(ch) max_len max(max_len, right - left 1) return max_len滑动窗口的通用套路是右指针不断前进把新字符纳入窗口当窗口不满足条件时左指针收缩直到窗口重新满足条件每次移动后更新答案。这个套路不仅能解决无重复子串问题还能解决最小覆盖子串、字符串排列、找到字符串中所有字母异位词等一系列问题。可以说把滑动窗口的几个基础变体吃透笔试中字符串处理类题目基本就稳了。不过要提醒一点滑动窗口类题目看起来代码量不大但边界条件非常多。比如窗口收缩时while和if的选择、左右指针的初始位置、结果更新的时机任何一个细节没处理好都可能出错。我建议平时刷题时不要只追求“能过测试用例”而是要尝试自己构造几组边界用例比如空字符串、全是相同字符的字符串、长度为1的字符串。3. C/C语言基础题看似送分其实到处是坑3.1 内存对齐和结构体大小这类题考的是编译器行为搜狐试卷中C/C部分的考察这几年一直是重头戏。2017年这套卷子也不例外其中关于结构体内存对齐的题目几乎每年都会出现。题目通常的形式是给你一个结构体定义问sizeof(struct)是多少。struct Test { char a; // 1字节 int b; // 4字节 char c; // 1字节 };如果你简单认为大小是1416字节那就掉坑里了。在默认对齐规则下int b需要4字节对齐所以a后面会有3字节的填充然后c占1字节整个结构体大小还需要对齐到最大成员对齐数的整数倍也就是4的倍数。所以最终结果是12字节而不是6字节。这类题考察的实质是你是否了解C语言结构体在内存中的布局规则以及编译器在背后做了什么。很多同学觉得这样的知识在工作中很少用到但其实在涉及网络协议解析、底层驱动开发、序列化场景时内存对齐直接影响数据布局和传输效率。笔试中遇到这类题我的建议是先算出每个成员的理论偏移量再考虑对齐填充最后把结构体总大小按最大对齐数取整。同时要注意有些题目会考#pragma pack(n)预处理指令这会改变对齐规则。看到这种修饰符一定不要忘了把对齐数改成指定的n。3.2 指针、数组与函数指针辨析神题比的是细节记忆力C/C基础中另一类高频考点是“指针和数组的关系”“函数指针和指针函数”这类辨析题。搜狐试卷的选择题里一般会安排2到3道这样的题。先看一道经典选择int a[5] {1, 2, 3, 4, 5}; int *p a;问sizeof(a)和sizeof(p)分别是多少。正确答案是sizeof(a) 20假设int占4字节sizeof(p) 864位系统下指针占8字节。这道题考察的就是数组名和指针的本质区别数组名代表整个数组的内存块而指针只保存地址。再看函数指针的常见考法int (*funcPtr)(int, int);这行代码声明了一个函数指针可以指向返回值是int、参数是两个int的函数。而“指针函数”则是int* func(int, int)表示一个返回值类型为int指针的函数。这两者差一个括号含义天差地别。应对这类题没有捷径只能多写、多辨析。每次遇到容易混淆的声明建议在编译器里实际跑一下看看输出和报错信息这样印象会比单纯看教材深得多。3.3 C中const、static、volatile的语义考察搜狐笔试对C基础关键字的考察同样细致。2017年这套卷子里就有一道关于const的经典题目问“以下哪种写法表示指针本身不可修改哪种表示指向的内容不可修改”。const int *p; // 指向const int的指针可以修改p但不能修改*p int *const p; // const指针不能修改p但可以修改*p const int *const p; // 指向const int的const指针p和*p都不能修改这道题看似简单但每年都有人错选。更进阶的考法是结合函数重载问void func(const int a)和void func(int a)能不能构成重载。答案是不能因为顶层const在函数参数传递时会被忽略。另外static关键字也是考察重点。C语言中static修饰局部变量改变生命周期、修饰全局变量限制作用域C中static成员函数没有this指针、不能访问非静态成员这些知识点各自独立又容易混淆。笔试中一旦出现多个选项分别描述不同语境下的static语义就需要特别留意。关于语言基础这部分我真的建议大家不要只看面经总结一定要自己动手写代码验证。我见过太多同学背得很熟一上机就写错因为面试考察的往往正是动手能力和记忆之间的差异。4. 操作系统与网络不用死记硬背但要会推导4.1 进程线程与死锁题目画图推演比背书有效操作系统在搜狐笔试中的占比不小大部分是以选择题形式出现少数是简答题。重点集中在进程与线程、调度算法、死锁、内存管理等章节。先说进程与线程。题目常常问你“进程和线程的关系以下哪个说法是错误的”实际上考察的就是两者核心区别进程是资源分配的基本单位线程是CPU调度的基本单位同一进程内的线程共享地址空间进程之间地址空间相互独立。再说死锁这也是操作系统题里的常客。死锁的四个必要条件互斥、持有并等待、不可剥夺、循环等待大家可能都背过但笔试喜欢换个方式考例如给你一段代码问是否可能发生死锁或者给你资源分配图让你判断是否处于死锁状态。应对这类题我自己的方法是画出资源分配图或者线程推进顺序图把每个线程持有和等待的资源列出来然后看是否形成循环等待。这比单纯背概念要靠谱得多因为笔试题几乎都是给具体场景让你判断而不是让你默写概念。4.2 TCP三次握手与四次挥手状态迁移必须信手拈来计算机网络部分主要考察TCP/IP协议其中TCP的三次握手和四次挥手状态迁移是重中之重。搜狐这份卷子里也有一道关于TCP连接状态的选择题。三次握手的核心是确认双方的收发能力这也是为什么需要三次而不是两次。第一次握手客户端发送SYN服务端明白了客户端的发送能力第二次握手服务端回复SYNACK客户端明白了服务端的收发能力第三次握手客户端再发送ACK服务端明白了客户端的接收能力。这样双方才都确认了彼此的收发能力。四次挥手相对复杂一点因为TCP连接是全双工的断开时每个方向的连接需要单独关闭。主动关闭方发送FIN被动关闭方回复ACK然后被动关闭方发送FIN主动关闭方回复ACK并进入TIME_WAIT状态。笔试中可能会问为什么主动关闭方要进入TIME_WAIT状态并且等待2MSL这里面有两个原因一是要确保最后一个ACK能让被动关闭方收到如果丢了可以重发二是要让本连接产生的所有报文段从网络中消失防止影响新连接。类似这样的问题在复习时一定要弄清楚背后的原理。网络知识最忌讳的就是死记硬背因为题目会变着花样考同一个原理只要原理清楚怎么变都难不倒。4.3 内存管理题目虚拟内存、分页和局部性原理内存管理也是搜狐笔试的常客。分页、分段、虚拟内存、页面置换算法这些都是选择题或简答题的高频考点。虚拟内存的核心价值是让每个进程以为自己拥有连续完整的地址空间而实际上数据按需加载到物理内存中。这个过程依赖分页机制和页表。题目可能会问“页面置换算法中LRU和FIFO的区别”甚至给你一串访问序列让你计算缺页次数。计算缺页次数这类题我建议平时一定要多动手画图。物理内存有多少帧就画多少个格子然后按访问序列逐一标记。画完之后你自然会理解LRU为什么要维护访问顺序也会理解为什么FIFO会出现Belady异常而LRU不会。这里要特别提醒搜狐的试卷会有一两道看似简单但需要细算的操作系统题很多同学一眼扫过去觉得会做就直接跳过了结果丢分非常可惜。凡是有序列、有数字的题建议在草稿纸上完整推演一遍不要心算。5. Linux与设计场景题工程能力在笔试中的隐形考察5.1 Linux高频命令查日志、查端口、看负载这些必须手到擒来搜狐研发工程师笔试试卷二里Linux操作相关的题目主要以简答题的形式出现。常见的是“如何查看Linux系统负载”“如何查找某个进程占用的端口”“如何查看某个日志文件的末尾100行”等等。这种题考察的本质是你是否真的用过Linux服务器而不只是装过虚拟机。我列几个高频命令建议默写掌握# 查看系统负载 top uptime # 查看端口占用 netstat -tlnp | grep 8080 ss -tlnp | grep 8080 # 查看日志末尾100行并实时跟踪 tail -100 app.log tail -f app.log # 查找文件 find /var/log -name *.log # 查看进程 ps -ef | grep java这些命令背后对应着真实的排障场景服务慢了要看负载、端口起不来要查占用、报错要看日志、进程找不到要看进程列表。如果只是背命令而不理解使用场景笔试里一旦换一种问法就容易蒙。比如问“如何找到CPU占用率最高的进程”你就需要知道top然后按P键排序问“如何找到内存占用最高的进程”你就需要按M键排序。关于Linux这部分我的建议是如果条件允许可以在自己电脑上装个虚拟机或者买个便宜云服务器把常用命令实际敲一遍尤其是top、netstat、tail这些组合起来使用的场景。实际折腾过一遍之后笔试里的Linux题基本就是送分题了。5.2 设计模式与场景设计题先想清楚需求再谈模式在简答题部分搜狐偶尔会考察设计模式但不会直接问“单例模式有哪几种写法”而是给一个场景让你选择或设计。举个例子可能会问“系统中有多个日志记录器分别负责向文件、数据库、控制台输出日志且未来可能需要新增输出方式请设计一个方案。”这类题目其实就是想让考生用策略模式或者工厂模式来组织代码。答题的时候我建议按照“场景分析 - 设计思路 - 模式选择 - 核心代码示意”的流程来组织答案。先写清楚这个场景中会变化的部分是什么然后说明如何用面向对象的多态性把变化封装起来最后画出类之间的核心关系。这里特别提醒不要在答案里堆砌设计模式。如果一道场景题的核心变化点只有一个而你却写出了工厂观察者装饰者三种模式反而会给面试官留下“滥用模式”的印象。正确的做法是围绕题目中最核心的变化点选择一到两个模式把理由写充分。5.3 系统设计题的答题套路限制条件永远优先于炫技方案虽然是笔试但搜狐的试卷中偶尔会有一道轻量级的系统设计题让考生简单设计某个功能模块。比如“如何设计一个短链系统”或者“如何设计一个缓存层”。这类题目在笔试卷面上往往空间有限不需要你画完整的架构图但需要你用精炼的语言把核心思路写清楚。我总结了一个比较通用的答题套路。首先要列出系统的核心功能和核心约束。比如短链系统核心约束是生成的短链要尽量短且唯一支持高并发访问需要能通过短链还原出原始长链。其次是方案设计一般包含存储设计、算法设计和扩展设计。存储用关系型数据库还是KV存储哈希算法使用哈希后转62进制还是使用发号器要不要引入缓存这些都是得分点。最后要说明方案的取舍。没有一种方案是完美的主动说明方案的局限性和改进方向会给阅卷人留下很好的印象。6. 我复盘完这份试卷后最想告诉你的三件事6.1 笔试不是临时抱佛脚能解决的但也不是无底洞复习过搜狐2017秋招研发工程师笔试试卷二之后我最大的体会是这类笔试考察的全是计算机基础课程中反复强调过的内容。它不像有些公司那样会涉及偏门算法或行业术语也没有要求你掌握某种具体技术栈。这意味着准备方向非常明确把数据结构、操作系统、计算机网络、C/C语言基础这四门课吃透外加刷部分LeetCode热门题你就能覆盖这套卷子90%以上的考点。关键在于知识的熟练度和理解的深度。很多人复习时喜欢把大量时间花在难题上做出一道困难级别的算法题就沾沾自喜。但搜狐这类公司的笔试试卷重点几乎都落在中等题和基础题上。把简单题和中等题做稳、做对、做得快远比啃下一道压轴难题更有性价比。我建议在秋招前两个月开始做系统复习其中前一个月以看书、看视频为主对整个知识体系做地毯式扫描后一个月以刷题和做往年笔试卷子为主每天至少手写2道中等难度的代码题同时针对自己做错的选择题整理错题本。6.2 用“整卷模拟”代替“单题刷题”效果完全不一样很多人备战秋招的时候习惯打开手机App刷题今天刷两道数组明天刷两道链表。这样做的缺点是知识点之间缺乏串联而且完全没有时间压力到了真实笔试时容易不适应。我的建议是在考前至少完整做3套以上模拟试卷包括这套搜狐2017秋招的试卷二。整卷模拟的价值有三个。第一个价值是训练时间分配。150分钟的试卷选择题、简答题、编程题各占多少时间必须心中有数。很多人选择题慢慢悠悠做了60分钟导致后面编程题时间严重不足整卷模拟能帮你找到自己的时间节奏。第二个价值是查漏补缺。单题刷题时遇到不熟的知识点你可能会避开但整卷模拟时你无法选择题目任何薄弱环节都会直接暴露出来。不要害怕做错做错恰恰说明这个知识点需要在考前搞定。第三个价值是训练手写代码的能力。真实笔试中有些是上机做题有些则是在纸上或在线编辑器里直接写代码无论哪种方式都和你平时在IDE里完全不同。没有自动补全、没有编译提示甚至可能没有编译器因此平时就要养成手写完整代码的习惯尤其是带头文件、带括号、带分号的完整代码。6.3 复盘比做新题更重要一套卷子至少刷三遍最后一个建议是关于复盘。我见过太多人刷题量很大但分数一直提不上去原因就是只注重“做”而不注重“复盘”。一套有价值的笔试试卷比如这份搜狐2017秋招研发工程师笔试试卷二值得刷三遍。第一遍在复习结束后第3到5天完整做一遍检测自己当前的水平第二遍在考前2周左右重点只做第一遍做错的题目并深挖每道错题背后的知识点第三遍在考前2到3天不需要完整重做只需要看错题本和知识框架把易错点再夯实一遍。特别是选择题部分不要只满足于知道正确答案要把每一个错误选项为什么错、错在哪里搞明白。一道好的选择题四个选项背后往往对应着四个知识点如果你能把这四个知识点都掌握这道题就变成了一道“复习提纲”。举一个我自己的例子我在复习时遇到一道关于TCP和UDP区别的选择题当时我不仅把TCP的可靠传输机制梳理了一遍还把UDP适合的场景、TCP的拥塞控制算法都过了一遍结果后来在真正的笔试中又遇到一道关于拥塞控制的题因为之前已经顺着线索复习过一遍所以答得特别顺利。说到底笔试考察的不是你“背了多少知识点”而是你在有限时间内能“调出多少知识”。复盘的深度直接决定了你在考场上的调出速度。最后再分享一个小技巧写代码题时先花30秒把输入、输出、边界条件圈出来再动手写。很多失分不是算法思路错而是边界条件没考虑周全。这个习惯我从搜狐笔试一直带到后来的工作中确实让我避免了很多低级错误。
返回列表