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

资讯详情

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

搜狗2020校招后端笔试复盘:考点分布与答题技巧

搜狗2020校招后端笔试复盘:考点分布与答题技巧 搜狗2020校招后端笔试第一场在当年的应届生讨论区里不算难但覆盖面特别全既能当“Java后端笔试复习提纲”也能用来检查自己的计算机基础有没有窟窿。搜狗后端岗位的技术栈以Java为主笔试不是全程硬核算法而是“基础广度工程落地”的组合选择题考计算机网络、操作系统、数据库、Java基础编程题考代码实现还有一道SQL大题直接切真实业务场景。下面我把这套卷子的考点分布、出题逻辑、答题套路完整拆一遍。无论你投的是不是搜狗这套考点基本都能通用正在准备后端校招或者暑期实习的朋友可以把它当成一份复习检查清单。1. 搜狗2020校招后端笔试整体结构与出题风格1.1 第一场笔试的基本盘题型、题量与时长搜狗2020校招后端第一场笔试形式是在线笔试总时长120分钟。题型固定为三块选择题单选加多选数量通常在15到20道覆盖计算机网络、操作系统、数据库和Java基础编程题2道第一道偏基础字符串、数组为主第二道会上升到数据结构设计或者稍复杂的逻辑SQL题1道给出业务表要求完成带条件的查询、统计或者排名。题型数量大致分值考点倾向选择题15-20道40%网络、操作系统、数据库、Java基础编程题2道40%数据结构、算法实现、边界处理SQL题1道20%多表查询、聚合统计、分组排名后端岗位方向本身的差异需要先分清楚。同样是“后端”Java后端、数据后端、嵌入式后端、甚至芯片数字后端的考察侧重点完全不同芯片后端更多是指IC设计的布局布线和软件后端不是一个赛道。搜狗这场笔试主要面向Java后端开发岗所以复习时的重心应该是通用计算机基础加Java体系加SQL能力而不是去刷硬件方向或者纯前端方向的内容。1.2 出题逻辑为什么不是纯算法竞赛搜狗的业务线包括搜索、输入法、AI等方向后端服务对请求量、稳定性和可维护性的要求很高。笔试的出题人并不是想招一个“算法竞赛选手”而是想找一个“基础扎实、能落地、有工程意识”的初级工程师。所以你会发现选择题专门往底层原理上打TCP状态、HashMap扩容、索引结构这类线上事故容易暴露问题的点编程题考的是能不能把一个想法稳定转化成可运行的代码SQL题则直接模拟业务查询考的是“给你一个真实需求你能不能查得对、查得快”。理解这个逻辑复习时就不会机械刷题。选择题靠理解“为什么”编程题靠多写多练SQL题靠平时真去数据库里跑一跑。还有一点要提醒笔试不考框架现在很多项目是Spring Boot加Vue这类前后端分离的架构但笔试题面不会让你写控制器和拦截器它考的是框架底下的原生能力Java集合、并发、SQL、网络协议。框架是面试聊项目时才用得上笔试阶段先把基本功打牢。2. 笔试考点复盘网络、操作系统、Java、数据库四张牌怎么打2.1 计算机网络三次握手、状态码、GET与POST性价比最高的得分点网络是后端笔试题选择题的重头戏。搜狗这场考得最多的是TCP和HTTP。TCP部分三次握手的状态变迁是必问的客户端发SYN进入SYN_SENT服务端回SYNACK进入SYN_RCVD客户端再回ACK后双方进入ESTABLISHED。四次挥手中主动关闭方会进入FIN_WAIT_1、FIN_WAIT_2被动方进入CLOSE_WAIT最后主动方还会在TIME_WAIT状态停留2MSL。很多人只记得“挥手四次”但为什么不是三次、为什么要等2MSL才是真正的考点。TIME_WAIT是为了保证最后一个ACK能可靠送达同时让旧连接的报文在网络中自然消失避免干扰新连接。HTTP部分状态码和请求方法经常组合出题。301是永久重定向302是临时重定向403是服务器理解请求但拒绝执行404是资源不存在503是服务不可用504是网关超时。GET和POST的区别不能只答“GET参数在URLPOST在Body”本质是语义差异GET用于获取资源不改变服务器状态POST用于提交数据、可能产生副作用。这样理解之后遇到“GET能不能带Body”这类变种题就不会慌。复习方法上建议把每一层协议的核心问题串成一条“为什么链”为什么要有TCP因为IP不可靠。为什么TCP要三次握手因为要同步双方的初始序号。为什么HTTP要keep-alive因为握手的成本高。把这条链理清比死记硬背八股有效得多。2.2 操作系统进程线程、死锁与内存管理操作系统选择题基本覆盖三个固定方向进程线程、死锁、内存。进程和线程的区别几乎是送分题但要答得完整进程是资源分配的基本单位线程是CPU调度的基本单位同一进程的线程共享地址空间进程之间地址空间隔离。协程是这几年越来越常考的补充点它是用户态调度、比线程更轻量很多高并发框架的底层调度都有协程思想。死锁考四个必要条件互斥、占有并等待、不可剥夺、循环等待。题目通常给一个场景让你判断是否会形成死锁或者问怎么预防。预防思路就是破坏四条件中的任意一个。常见错误是有人把“循环等待”当成“死锁已经发生”其实循环等待只是必要条件之一必须四个条件同时成立才会死锁。内存部分虚拟内存的核心作用是隔离和扩展每个进程都有独立地址空间通过页表映射到物理内存。页面置换算法里LRU是高频考点思想是把最近最少使用的页面换出去。这里有个易错点栈和堆的区别不是网上传的“谁快谁慢”而是管理方式和生命周期。栈由编译器自动分配释放堆由程序员手动申请释放这也是为什么线程栈默认大小有限而堆可以开很大。2.3 Java基础与JVMString、集合、垃圾回收搜狗后端笔试的隐藏重点搜狗后端以Java为主所以Java相关选择题分值不低而且经常出“看着简单实则陷阱”的题。String这一块String、StringBuilder、StringBuffer三者的区别是经典题。String不可变因为底层char数组被final修饰且String类本身也是final不可变带来的好处是hash值可以缓存、线程安全、适合做常量池复用。但循环拼接String会不断创建新对象性能很差应该用StringBuilder。StringBuffer是线程安全的方法加了同步锁但单线程下性能不如StringBuilder。考场上经常问“下面哪种方式拼接一万次字符串最快”答案就是StringBuilder。HashMap也是必考中的必考。JDK1.8及以后HashMap底层是数组加链表加红黑树通过hash定槽位冲突时用链表链表长度超过8且数组长度大于等于64时链表转红黑树。为什么要转红黑树链表查询是O(n)红黑树能降到O(log n)但红黑树节点占用空间更大所以只在冲突严重时才转换。HashMap不是线程安全的多线程并发put可能死循环、数据丢失并发场景应该用ConcurrentHashMap它用CAS结合synchronized控制并发而不是给整个map加锁。集合遍历时删除元素是笔试和面试都爱考的坑。在foreach里调用list.remove()会抛出ConcurrentModificationException原因是迭代器的modCount与预期值不一致。正确做法是用Iterator的remove方法或者用JDK1.8的removeIf。JVM部分类加载的双亲委派模型要知道AppClassLoader会先让父级ClassLoader尝试加载父级加载不到才自己尝试这是为了保证核心类不被重复加载和篡改。2.4 数据库与SQL索引、事务、隔离级别数据库题在四门基础里占比不算最大但SQL大题单独占一道所以地位很重要。索引部分B树索引和哈希索引是高频对比。哈希索引等值查询O(1)但不支持范围查询也不支持排序B树索引支持范围查询和排序叶子节点用双向链表连接范围扫描性能好。聚簇索引叶子节点直接存整行数据非聚簇索引叶子节点存主键值所以通过非聚簇索引查询时如果命中的列不满足覆盖索引还要回表查询。事务部分ACID四个特性要能说清楚原子性、一致性、隔离性、持久性。隔离级别从低到高是读未提交、读已提交、可重复读、串行化。读未提交会脏读读已提交避免脏读但会出现不可重复读可重复读避免脏读和不可重复读但可能幻读串行化全部避免但并发性能差。MySQL默认是可重复读InnoDB通过间隙锁配合当前读解决幻读问题。这个知识点面试延伸特别强笔试选择题遇到“哪个隔离级别解决幻读”时不仅要答对选项还要能说出MySQL的默认实现。3. 实操复盘编程题与SQL题的标准答题流程3.1 编程题先写思路注释再写代码在线笔试不像本地IDE没有自动补全和断点调试手写代码时必须“先思路后代码”。我推荐的顺序是读题后先在代码区写注释把算法思路和边界条件列出来再在注释下方逐行实现。这样既能防止思路中断也能在写错时快速回溯。搜狗后端笔试编程题第一道通常是基础题第二道会上升到“数据结构设计”级别。这里用一道高频题“LRU缓存”举例。它要求实现一个固定容量的缓存get和put的时间复杂度都是O(1)缓存满时淘汰最久未使用的key。核心方案是HashMap加双向链表HashMap负责O(1)查找双向链表负责维护访问顺序。为什么不直接用LinkedHashMap因为笔试往往要求手写底层结构而且面试官会追问内部实现手写一遍能加深理解。import java.util.HashMap; import java.util.Map; class LRUCache { private static class Node { int key, value; Node prev, next; Node(int key, int value) { this.key key; this.value value; } } private final int capacity; private final MapInteger, Node map new HashMap(); private final Node head new Node(0, 0); private final Node tail new Node(0, 0); public LRUCache(int capacity) { this.capacity capacity; head.next tail; tail.prev head; } public int get(int key) { Node node map.get(key); if (node null) { return -1; } moveToTail(node); return node.value; } public void put(int key, int value) { Node node map.get(key); if (node ! null) { node.value value; moveToTail(node); return; } if (map.size() capacity) { Node removed head.next; removeNode(removed); map.remove(removed.key); } Node newNode new Node(key, value); map.put(key, newNode); addToTail(newNode); } private void moveToTail(Node node) { removeNode(node); addToTail(node); } private void removeNode(Node node) { node.prev.next node.next; node.next.prev node.prev; } private void addToTail(Node node) { node.prev tail.prev; node.next tail; tail.prev.next node; tail.prev node; } }写完代码后一定要在脑海里跑两个测试用例一是缓存满后put新key确认最久未使用的头节点被淘汰二是get已存在的key后确认该节点被移到尾部访问顺序更新。笔试时没有调试器“脑内跑用例”是得分的关键习惯。3.2 编程题另一类高频题型滑动窗口与字符串处理后端处理请求、解析协议、过滤日志都离不开字符串所以字符串类题目在笔试中非常高频。滑动窗口是字符串子串题的标准解法比如“给定一个字符串s找出其中不含有重复字符的最长子串的长度”。思路是维护窗口的左右边界left和right用HashSet记录窗口内字符。right不断右移遇到重复字符时left右移并把对应字符从集合中移除直到窗口内没有重复字符每次更新窗口长度最大值。public int lengthOfLongestSubstring(String s) { SetCharacter window new HashSet(); int left 0, maxLen 0; for (int right 0; right s.length(); right) { char c s.charAt(right); while (window.contains(c)) { window.remove(s.charAt(left)); left; } window.add(c); maxLen Math.max(maxLen, right - left 1); } return maxLen; }这类题每次笔试都会出现换汤不换药。考生常见错误是忘记处理空字符串、忘记更新最大值、或者right和left边界搞混。建议在答题前先写两行注释“输入为null时返回0”“窗口内字符用Set维护”。答题区两三行注释不会浪费时间反而能让你在紧张的考试节奏里保持清晰。3.3 SQL大题从读题到提交的三步法SQL大题在笔试中一般是最后一道如果前面时间耗得太多很容易空着。我的建议是哪怕编程题第二道没做完也要先保SQL题因为SQL题的得分确定性更高。以“学生、课程、成绩三张表查询每门课程成绩排名前三的学生”为例。表结构是student(id, name)course(id, name)score(student_id, course_id, score)。第一步先确定需要哪些字段课程名、学生姓名、成绩、排名。第二步用窗口函数按课程分组、按成绩降序排名外层再过滤排名小于等于3SELECT course_name, student_name, score FROM ( SELECT c.name AS course_name, s.name AS student_name, sc.score, ROW_NUMBER() OVER (PARTITION BY c.id ORDER BY sc.score DESC) AS rk FROM score sc JOIN course c ON sc.course_id c.id JOIN student s ON sc.student_id s.id ) t WHERE t.rk 3;如果笔试平台是MySQL 8.0以下版本不支持窗口函数就要用自连接实现。思路是统计每个学生成绩比他高的人数如果小于3说明他排在前三名。两种写法都要会因为不是所有平台都支持窗口函数。需要特别注意的是题目要求“前三名”还是“前三条记录”。如果成绩并列第一ROW_NUMBER会给出1、2、3的排名但第二名可能是空缺的RANK和DENSE_RANK的并列处理也不一样。读题时看清楚关键词必要时在答案里注释“如果要求并列改用DENSE_RANK”。4. 刚踩过的坑笔试现场最容易翻车的几个瞬间4.1 时间分配失误编程题死磕到底在线笔试最常见的问题不是不会做而是时间分配崩了。有些同学第一道编程题做不出来就死磕二十分钟结果第二道和SQL题全空着正确率再高也白搭。我的建议是拿到试卷先花三分钟把全部题目扫一遍标注简单题、中等题、难题。选择题控制在每题一分钟以内拿不准的标个记号不要在单选多选上反复纠结两道编程题各分配20到25分钟超过30分钟没思路就跳把SQL题保下来最后剩10分钟倒回去检查标记的题目。这个时间计划不一定完美但能保证不出现“会的题没时间写”的惨剧。4.2 多选题漏选多选没有把握宁愿少选搜狗这场的多选题和常见校招平台一样判分规则基本是“多选、错选不得分少选部分得分”。所以多选题一定要克制拿不准的选项不要勾能确定的才选。多选题的陷阱主要出在“看着像对的其实是错的”上。比如“关于HashMap的说法正确的是”选项A说“线程安全”选项D说“允许key为null”。如果你记得ConcurrentHashMap线程安全而HashMap不安全就能果断排掉A如果只记得“HashMap线程不安全”但不确定key是否可以为null那就不选D。宁可少拿一半分也别因为一个不确定的选项白丢整题分。4.3 编程题细节循环边界与数据溢出手写代码最容易翻车的两个细节是循环边界和数据溢出。循环边界方面数组遍历时下标从0开始容易在边界上多一位少一位。做题时建议把示例输入转成具体数组手动走一遍循环确认i0和in-1时的行为符合预期。数据溢出方面题目如果给出数据范围达到10的9次方累加时默认要用long否则int会溢出。笔试平台有时候故意在样例里埋大数本地看起来没问题提交后WA很可能就是溢出问题。养成习惯凡是涉及累加、乘法先看题目数据范围再看是否需要long。4.4 如何用“笔试复盘”反哺后续面试笔试的真正价值不是分数而是暴露知识盲区。考完别急着关页面把不会的选择题、做错的知识点、没写完的代码题记录下来。很多公司的面试官会在面试里追问笔试题目比如笔试考了TCP四次挥手面试就可能追问“TIME_WAIT为什么是2MSL”“大量TIME_WAIT连接怎么办”笔试考了LRU面试就可能追问“Redis里的LRU为什么是近似LRU”。我自己的做法是每次笔试后花30分钟做复盘表格记录题目类型、考察知识点、错误原因、正确解法。刷三五场之后知识盲区会越来越小后续笔试的正确率会有明显提升。这比海量刷题更有效因为它是在精准补漏洞。4.5 在线笔试环境的两个隐形坑在线笔试环境还有两个隐性坑。一是摄像头监考和切屏检测笔试过程中如果页面切换次数过多系统会记录甚至直接判定作弊笔试前把电脑里的无关软件退掉弹窗提醒关掉。二是复制粘贴限制有些平台禁止从本地IDE粘贴代码必须现场手敲提前适应用纯文本编辑器写代码不要依赖IDE的自动补全。笔试前试着用在线编程界面模拟一场熟悉没有自动补全、没有实时编译提示的输入方式真正考场上就不会手忙脚乱。这个练习很多人忽略但它对提升临场状态非常有用。最后再分享一个复盘体会。搜狗2020校招后端第一场笔试题面本身不算偏但覆盖面很广它真正考验的是你在有限时间里“会不会抓大放小”。见过太多同学算法刷得很猛却被选择题里的HashMap底层问住或者编程题写完了SQL却没跑通。把计算机基础、Java集合与JVM、SQL实战这几块补齐再练几次限时模考这套卷子其实就是你拿offer路上的一块普通垫脚石。要不要试试用这篇文章当提纲给自己安排一次120分钟模拟笔试做完再对照考点你会很清楚自己差在哪里。
返回列表