公司动态
2024秋招OPPO后端笔试复盘:题型考点与备考策略
2024年秋招OPPO后端岗笔试从投递到交卷的完整复盘先交代一下背景我是2025届毕业生2024年暑期前后开始投递秋招提前批和正式批OPPO后端岗的笔试大概在九月上旬做的。当时我已经刷了三百多道力扣也啃完了计网、操作系统、MySQL和Redis的常规八股自以为准备得差不多了结果打开笔试页面第一题就让我愣了几秒。不是题目难而是它和我想象中的大厂后端笔试风格差别挺大。这篇文章就把我完整经历的笔试流程、题型构成、考点分布、编程题复盘和备考策略写出来给接下来投递OPPO后端岗的同学做一个参考。适合看这篇内容的人有两类一类是刚开始准备秋招、对后端笔试还比较模糊的同学你可以通过这篇文章建立对OPPO笔试的整体认知另一类是已经刷了题但不知道如何分配时间、不知道哪些考点性价比更高的同学我会在最后专门讲基于这次笔试得出的备考优先序判断。坦白说OPPO后端岗笔试在其覆盖面上并不算所有大厂里最难的但它有一个特点——考得非常综合且业务感强。同样叫后端笔试有些公司全是选择题有些公司全是ACM风格算法题而OPPO的这场笔试介于两者之间既考你对基础理论的掌握深度也考你在限定时间内写出可运行代码的能力。这也是我为什么想把它单独拎出来写一篇复盘的原因。1. 笔试当天的时间线与题型占比第一部分到底在考什么先说整体情况。我这场笔试的时长为90分钟题量不算大但时间也不算宽裕。进入系统后整张卷子分为两个大的模块客观题选择题多选题和编程题。客观题大约有20道覆盖的范围很广——Java基础、Spring框架、MySQL、Redis、操作系统、计算机网络、Linux命令、场景设计甚至还有两三道逻辑推理题。这里要特别提一下逻辑推理题它出现在技术笔试里确实让我有点意外虽然题目本身不难类似行测里面那种数字推理和条件判断但如果你完全没准备过突然遇到会浪费几分钟去适应题型。编程题部分一共两题一题是纯算法题另一题是偏业务场景的半模拟实现题。也就是说第二道题并不是让你解一个纯粹的算法问题而是给一段业务描述让你实现一个具备特定功能的类或接口这对代码规范和工程思维的考察明显多于对算法技巧的考察。时间分配上我的节奏是前30分钟做客观题先快速过一遍会的直接选不确定的标记好等编程题做完后如果有剩余时间再回头纠结。中间50分钟做两道编程题第一题花大概20分钟第二题花30分钟。最后10分钟检查回到标记过的客观题以及检查编程题的边界条件和代码格式。我实测下来的建议是不要在一道客观题上纠结超过2分钟尤其是多选题你永远不知道是不是有一个选项是出题人故意挖的坑。如果拿不准先按第一印象选标记掉后边有时间再回来看。90分钟看着不算少但如果前边某道场景题让你多花了几分钟后边的编程题时间一压缩你写出来的代码质量会明显下降。题型占比方面按我的记忆大概如此模块题量分值占比主要内容单选/多选客观题约20题约50%Java、框架、数据库、计网、OS、场景算法编程题1题约20%数据结构与算法中等难度业务设计编程题1题约30%面向对象设计核心逻辑实现这个占比意味着什么它意味着一味刷题是拿不到高分的。我认识不少算法刷得很猛、但基础理论记不牢的同学最后在这张卷子上反而没有占到太大优势。反过来如果你把Java基础和Spring的原理理解透了客观题部分能稳稳拿下编程题再对一道总分就会比较好看。2. 从热搜词反推OPPO后端笔试的风向Spring和Redis为什么永远躲不掉笔试结束之后我回顾了整张卷子的考点分布发现它和过去半年大家在技术社区里讨论的热点高度重合。说实话热搜词这个东西对押题是有参考价值的——大家密集搜索的地方往往就是面试官觉得重要、同时大家又记不牢的地方。先说Spring。客观题里至少有三道直接和Spring相关一道考察依赖注入的几种方式问的是构造器注入和setter注入的区别以及各自的适用场景一道考察Spring的事务传播机制选项里列出了六种传播行为让你选出默认值和某个具体业务场景下该用哪一个还有一道考察Spring MVC的请求处理流程从DispatcherServlet开始到HandlerMapping、HandlerAdapter、Controller、ViewResolver的完整链路。这里有个值得注意的点OPPO不是让你背概念而是给一个具体场景让你判断会发生什么。例如一个Service方法内部调用了同类中的另一个带Transactional注解的方法事务会不会生效——答案是不会。因为Spring默认的代理方式是基于动态代理的同类内部调用走的是this指针不会经过代理对象事务注解自然不生效。这类看起来很简单一做就错的题其实是笔试筛人的核心手段。再来说Redis几乎每家大厂后端笔试都躲不开RedisOPPO也不例外。我印象最深的是一道关于缓存穿透的题。题目描述了一个高并发场景某个热点商品详情的接口请求量非常大此时如果缓存和数据库中都不存在该商品可能会出现什么问题选项里给了缓存穿透、缓存击穿、缓存雪崩三个概念让考生判断属于哪一种并选出合适的应对方案。很多同学会把穿透和击穿搞混。简单记法穿透查了一个不存在的key缓存和数据库都没有请求直接打到数据库。击穿一个热点key在缓存过期的瞬间大量请求同时打到数据库。雪崩大量key同时过期或者redis服务本身挂了导致大面积请求打到数据库。对应方案也不同穿透用布隆过滤器或者缓存空值击穿用互斥锁或者逻辑过期雪崩用过期时间加随机值或者集群高可用方案。这道题如果你只记住了概念没有理解在什么场景下用哪种方案遇到变体题就很容易选错。还有一个考点让我觉得OPPO很关注工程实践那就是前后端分离下的跨域问题。虽然这是后端笔试但卷子里确实出现了一道关于CORS的题。它给出的场景是前端项目运行在localhost:5173后端接口部署在localhost:8080为什么前端请求会失败该怎么解决这道题本质上考的是浏览器同源策略和跨域资源共享机制。你不仅需要知道CORS的基本流程——浏览器预检OPTIONS请求、后端返回Access-Control-Allow-Origin头还需要知道在Spring Boot里如何配置以及为什么生产环境通过Nginx反向代理也能解决。单纯会背后端加个CrossOrigin注解是不够的它更像是让你理解浏览器、前端服务、后端服务三者之间的关系。我把这次笔试里和热搜词高度相关的技术点整理成了一张对照表热搜/高频词笔试对应考点考察深度Spring / Spring BootIoC、事务传播、MVC流程能判断实际场景行为Redis穿透/击穿/雪崩、持久化会选方案、会解释原理前后端分离跨域CORS、接口设计知道浏览器限制与解决方案MySQL索引失效、事务隔离级别能分析SQL执行计划JVM内存区域、GC算法能判断对象生命周期并发编程synchronized、线程池参数能写安全代码总之如果你备考时间有限我强烈建议优先把Spring事务、Redis缓存三大坑、MySQL的索引和隔离级别、JVM内存模型这四块吃透。这四块在客观题里的出场率极高而且它们之间是互相联动的——例如Redis缓存了数据库的数据数据库的事务隔离级别如何影响缓存一致性这种综合性题目一旦把基础原理掌握到位推理起来并不难。3. 两道编程题的完整复盘从暴力解法到最优解的选择逻辑编程题是笔试中最容易拉开差距的部分也是我考完最有表达欲的部分。先说第一道题——纯算法题。题目大意是给定一个整数数组和一个目标值要求找到数组中两个元素的和等于目标值的所有唯一组合并输出这些组合的下标。这个题目表面上是LeetCode的Two Sum变体但它加了一个限制——要求输出所有不重复的组合且每个元素只能使用一次。我看完题的第一反应是简单但真正动手写的时候才发现有几个坑如果数组里有重复元素直接套LeetCode的两数之和模板会输出重复组合。你需要先去重或者用哈希表配合上一次使用的位置来去重。返回的是下标组合排序要求是什么要看清。他要求按第一个下标升序输出。边界条件数组长度小于2时直接返回空。我的解题思路是先排序再用双指针。排序的目的是让重复元素相邻方便跳过。双指针可以做到O(n)的时间复杂度找两数之和等于目标值。注意因为要返回下标排序后下标会乱所以额外的处理是先用一个类或二维数组保存原始下标再排序。如果面试时遇到这道题你其实可以先用最暴力的双重循环写一版——O(n²)简单直观然后再优化成排序双指针的O(n log n)版本或者哈希表的O(n)版本。笔试平台判题只认最终提交的那一版但你在草稿纸上的思维过程决定了你的最终代码质量。我建议的思路是先想清楚暴力解法再一步步推导优化点最后再动手写。这样既不会漏边界也不会一上来就把自己绕进哈希表去重的坑里。第二道编程题是一道偏业务的场景题。题目描述了一个简化版的订单超时自动取消系统系统中有大量订单每个订单有一个创建时间和超时时间需要你在超时时间到达时自动把订单状态改为已取消。要求实现一个类提供两个方法方法一接收订单创建信息方法二检查当前时刻有哪些订单应该被取消。这道题考的东西很实在数据结构选型你会不会用优先队列堆或者有序集合来管理待超时订单时间轮的运用你知不知道时间轮Timing Wheel这种处理延迟任务的标准方案并发安全你的类是否线程安全我当时选了优先队列的方案。核心逻辑是每次创建订单时计算超时时间戳放入一个按时间戳排序的小顶堆堆顶就是最早需要超时的订单。后台有一个线程不断拿当前时间戳和堆顶比较如果当前时间大于等于超时时间就弹出并做状态更新。这个方案的优势是插入和删除都是O(log n)内存占用可控代码量也少。缺点是如果同一时刻有大量订单超时批量弹出的性能会有波动。实际生产环境中大家更常用的是时间轮算法它把时间分成槽位每个槽位放一批订单扫描槽位时批量处理吞吐量更高。但笔试场景下你写优先队列方案已经完全够用而且逻辑清晰更容易拿全分。这里我想特意强调一个细节笔试题的第二道通常会留给你有时间写但没时间优化的空间因此你不必追求最优解先保证代码正确可运行再考虑优化方案。我犯过一次错误在某次模拟笔试中一上来就写时间轮结果推演到一半发现自己对槽位数量和轮次推进的理解还有漏洞最后代码没调通。从那以后我给自己定了一个规矩笔试编程题只写自己最有把握的解法哪怕复杂度高一点但一定要跑通。4. 计算机基础题的真实难度比八股深一点比面试浅一点OPPO笔试的客观题里计算机基础部分是我认为最有区分度的部分。它不会像LeetCode那样直接让你手写红黑树也不会像大厂面试那样让你从零讲一遍操作系统内存管理。它更像是在基础知识点上稍微拐一个弯考察你是否真的理解了这个知识点。我列出几个印象深刻的题目类型供大家参考。4.1 操作系统进程调度和死锁的变体题有一道题是给出一组进程的到达时间和执行时间让计算平均等待时间。这种题本身不复杂但它要求你会画甘特图理解短作业优先、时间片轮转两种调度算法的区别。特别是时间片轮转如果你忘记了新到达的进程是排在队尾还是队首这个细节算出来的结果会完全不同。我的记忆方法很简单优先队列通常是非抢占式的轮转调度是抢占式的新进程到达后统一加入就绪队列尾部每次执行一个时间片然后切换到队首的下一个进程。死锁那题也很有代表性。它给出了四个进程、四种资源问当前系统是否处于死锁状态并要求判断安全序列是否存在。实际上就是银行家算法的简化版。你需要手动算一遍Available矩阵看是否存在一条路径能让所有进程都完成。虽然这种题目计算量不大但极考验细心。我在算的时候就很担心自己某个数字抄错导致后续全错。4.2 计算机网络TCP和HTTP是永远的主旋律计网部分的题目占比比我预想的要高这是合理的——后端开发每天打交道最多的就是HTTP和TCP。有一道题让你解释TCP三次握手和四次挥手的过程但它的问法不是让你背书而是给出了一个实际异常场景如果服务端在收到SYN后没有回复SYNACK可能是什么原因四个选项涵盖了防火墙丢弃了SYN包、服务端listen队列已满、客户端的连接请求被拦截、客户端的源端口被占用。答案是服务端listen队列已满这种情况比较典型。当listen队列满了内核会直接丢弃新的SYN请求不会回复SYNACK。如果你只是背过三次握手是SYN、SYNACK、ACK而没有理解这个机制背后操作系统层面的实现这道题你就选不对。还有一道HTTP相关的题问的是HTTP/1.1的Keep-Alive和HTTP/2的多路复用有什么区别。后者是近几年面试和笔试的热点它的核心是在同一个TCP连接上并发传输多个请求和响应解决了HTTP/1.1的队头阻塞问题。所以答案是多个请求可以并行处理而不需要等前一个响应完成。这个知识点建议所有后端同学认真掌握不单是为了笔试字节、阿里、腾讯的面试里出镜率也很高。4.3 MySQL索引失效和事务隔离级别MySQL部分的题目很典型有一题给了四条SQL语句问哪一条能够走索引。选项设计的很聪明有的是在索引列上用了函数比如WHERE YEAR(create_time) 2024有的是在索引列上做了隐式类型转换比如WHERE phone 13800138000而phone列是varchar类型有的是左模糊查询LIKE %abc%。这三条都会被面试官用来考察你对索引失效原理的理解。真正的核心是B树的搜索依赖于有序性函数操作和类型转换会破坏这个有序性导致优化器放弃索引。而你的作答策略应该是从执行计划的角度去解释——用EXPLAIN关键字看type字段和key字段而不是单纯背哪些写法会导致索引失效。事务隔离级别那道题也值得一提。它把四种隔离级别和三种问题脏读、不可重复读、幻读做了对应让你选出正确搭配。这个知识点不难但很容易记混。我的记忆口诀是读未提交——什么都不隔离脏读、不可重复读、幻读都会有。读已提交——解决脏读但还有不可重复读和幻读。可重复读——MVCC解决了不可重复读但InnoDB默认级别下对幻读也有一定处理准确说是对部分幻读有处理需要锁或间隙锁才能完全解决。串行化——全都解决但性能最差。另外MySQL那题还顺带考了MVCC机制的基本原理让你判断在可重复读隔离级别下一条SELECT语句读到的是哪个版本的数据。这就要你理解隐藏字段DB_TRX_ID、DB_ROLL_PTR和undo log之间的关系了。推荐在复习时直接手画一张表用两个隐藏列版本链的方式去推演比死记硬背效果要好。4.4 JVM和并发看起来八股实际考理解JVM部分的题目主要落在内存区域和垃圾回收上。比如给出一段Java代码问其中创建的对象在哪个内存区域或者问一个对象在经历多少次Minor GC后可能晋升到老年代。这种题对搞过JVM调优的同学来说很简单但对只背了八股的人来说很容易在对象什么时候进入老年代这个问题上卡壳因为动态年龄判定并不是简单地数次数。并发编程的题则更侧重实践。有一道题是让你选线程池的参数给定的场景是IO密集型任务CPU核心数为8。正确答案一般为核心线程数设置在CPU核心数的2倍左右比如16个线程。如果你不了解IO密集型任务的特点是线程大部分时间在等待IO你会习惯性地把核心线程数设为CPU核心数1这恰恰是不匹配的。类似的考察点还出现在synchronized和ReentrantLock的区别、volatile的可见性和禁止重排等基本面上。5. 秋招笔试的备考优先序我踩过的时间分配教训最后这部分写给正在备考的人。我不打算面面俱到地列一个90天备考计划因为每个人都有不同的基础和节奏我只想基于这次OPPO笔试和同期的大厂笔试经历讲一下时间分配和优先序问题。首先是客观题和编程题的备考权重。我前期花了很多时间刷LeetCode算法基础确实扎实了但在OPPO这种客观题占比百分之五六十的笔试里纯算法刷题并不能让你的分数起飞。如果让我重新安排时间我会在准备秋招的前两到三个月做出这样的分配40%时间刷算法题以LeetCode Hot 100为主重点覆盖数组、链表、二叉树、哈希表、动态规划和贪心。不追求偏难怪题追求中等难度题的正确率和速度。30%时间过八股Java基础、Spring、MySQL、Redis、计网、操作系统用思维导图过两遍每一遍都要求自己不看答案说出原理和场景。20%时间做项目深挖把简历里的项目从头到尾梳理一遍特别是项目中用到的技术栈和实际踩过的坑保证提到任何一个技术点都能讲清楚。10%时间做模拟笔试用牛客网的在线编程环境做3到5套模拟卷熟悉笔试平台的输入输出格式、代码编辑器的特性以及90分钟的时间压力。这中间最容易被忽视的是模拟笔试。我身边不少同学抱怨算法题我在力扣上能写出来怎么到了笔试平台就老是编译不过原因多半是平时在IDE里习惯了自动补全到了笔试那种简易编辑器里手写 import 和各种边界条件心理压力一上来就容易出错。实测下来提前做几套模拟卷真的能明显改善这个问题。其次是笔试中遇到不会的题怎么办的策略。我的经验是先跳过最后再回头蒙千万不能恋战。第一场大厂笔试的时候我遇到一道多选四个选项看起来全都没见过我就硬着头皮在那里分析足足花了八分钟最后还是没搞明白。结果后面编程题只剩不到四十分钟导致写得非常仓促边界条件也没处理到位。吃过这个亏之后之后所有笔试我都严格执行单选90秒、多选150秒、超时标记跳过的策略。再说一下不同基础的同学备考重点会有什么差异。如果你Java基础还比较薄弱我建议别急着背Spring先把Java集合类的源码看一遍尤其是HashMap的put流程、resize机制和ConcurrentHashMap的分段锁逻辑这些几乎是所有后端笔试的送分题也是后续理解Spring和Redis的基础。如果你Java基础已经很扎实那重心可以放在Spring事务传播机制和Redis缓存一致性这类偏场景化的知识点上因为这些内容往往是客观题里拉开分数的地方。最后再说一个大家容易忽略的点——笔试用的编程语言选择。OPPO后端岗笔试支持多种语言但如果你投的是Java后端岗强烈建议用Java作答。理由很简单第二道业务设计题通常默认你掌握面向对象设计用Java写出来的类结构更符合阅卷人的预期而且Java的集合框架和并发工具类是现成的优先队列、线程池这些直接调用代码量少、不易出错。如果你用C做虽然算法题不吃亏但到业务设计题你就会发现写一个线程安全的定时任务类要比Java繁琐不少。笔试题通常不允许引入第三方库这个限制对Java来说是天然的友好——标准库实在太全了。另外特别提醒一下现在很多笔试平台已经不支持本地IDE调试了全部在网页端完成。你最好提前熟悉一下平台上的代码补全程度——有些平台有基础的语法高亮但没有自动补全有些连括号匹配都没有。日常刷题时养成手写完整代码的习惯尽量不要依赖IDE的自动生成这样到了笔试环境才不会手忙脚乱。备考到后期我自己的一个经验是不要只看八股文要动手把关键代码写一遍。比如Spring事务失效的场景你光背同类调用不生效是不够的最好自己在IDE里写一个小Demo打上断点看看代理对象和原始对象的区别。再比如线程池的拒绝策略你光背AbortPolicy、CallerRunsPolicy的区别也没什么深度最好写一段代码把队列填满让线程池触发拒绝策略观察日志和控制台的变化。这些动手经验在笔试的时候会转化为一种直觉让你遇到场景题时不需要在脑海里反复推理一眼就能看出答案。笔试是秋招的第一道关卡过了笔试之后还有两到三轮面试等着你。OPPO后端岗后续面试中面试官极大概率会追着你笔试里的某道题问你当时的思路所以考完别急着删记录把有价值的题目整理到自己的错题本里后续复习还会用得上。最后分享一个我亲测有效的小技巧无论笔试还是面试遇到会的题先求稳遇到不会的题先记下来等整场结束之后再回头翻资料补齐。后者往往是你能和别人拉开差距的地方因为它逼着你在高压下保持冷静也让你知道自己的知识盲区到底在哪儿。祝所有备战秋招的同学都能拿到心仪的offer。