十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

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

2024秋招OPPO AI算法岗笔试全解析:从数据结构到AI理论

2024秋招OPPO AI算法岗笔试全解析:从数据结构到AI理论 “收到OPPO笔试邮件的时候我正在图书馆刷LeetCode。”这是很多参加2024年秋招的同学最真实的状态。2024年秋招的OPPO AI/算法岗笔试整体难度在各大厂里属于中上水平既没有特别离谱的偏题怪题也绝不是靠背几道八股就能轻松过关的。这场笔试覆盖了数据结构与算法、机器学习与深度学习基础、编程能力、甚至一部分工程落地思维前后大概90到120分钟题量不小节奏感很重要。这篇内容就是结合我自己以及身边同学的实战复盘把OPPO AI/算法岗笔试的题型结构、核心考点、典型题目思路、踩坑细节一次性讲清楚。如果你也在准备AI/算法方向的秋招尤其是目标里有OPPO那这篇文章非常适合你。1. 笔试形态与备战节奏1.1 笔试平台的答题形态与题型分布OPPO 2024年秋招的AI/算法岗笔试大概率是在牛客网或者赛码网上完成的考前邮件里会写清楚。整个过程有双机位监控所以得提前准备好带摄像头的电脑最好再有一台手机架在侧后方。不要觉得这是小事我见过不止一个人因为环境检测没过折腾了半小时才进入答题界面白白浪费了宝贵的做题时间。题型上我印象比较深的是三个模块单选题和多选题主要考机器学习、深度学习、数据结构、计算机基础大概10到20道。编程题2到3道分值占比很高从简单到中等难度都可能有。简答题有一部分批次的笔试会有比如让你解释某个模型的原理或者某个算法的优化思路。题量和时长放在一起看是有点紧张的。如果选择填空卡住了后面编程题就很容易写不完。笔试平台支持的语言一般是C、Java、Python三选一输入输出需要自己处理。这一点和力扣不一样不是把函数写完就行而是得能处理标准输入输出平时要多练一练。1.2 时间分配与答题顺序的心得我的建议是先做编程题再回头做选择题。原因很简单编程题分值高、区分度大而且机器判分写出来就有分部分分也是分。选择题虽然多但每个分值不大而且很多题看一眼就能排除两个选项留到最后用剩下时间快速扫一遍效率更高。如果硬要按顺序做也建议给自己定一个“死线”。比如选择题最多花30到40分钟超过这个时间必须跳。我在实际笔试中采取的就是“编程题优先”的策略。先花十几分钟把第一道编程题写出来稳住基本盘然后快速做选择题把会做的先拿住最后再集中火力攻第二道编程题。这种节奏帮我避免了很多同学遇到的“选择题做high了编程题没时间”的惨案。另外一个细节牛客网编程题的输入输出有时候会藏坑。比如有多组测试数据要用while True: try: ... except: break的写法又比如输入可能包含空格分隔的字符串用input().split()处理时要小心。建议平时练习就用牛客或者赛码的模拟环境不要总在力扣那种“只填函数”的环境里刷不然笔试时手忙脚乱。2. 算法与数据结构笔试的半壁江山2.1 高频考点分类从排序到动态规划AI/算法岗的笔试算法和数据结构永远是占分大头。OPPO这套卷子也不例外选择题和编程题里反复出现的就是下面这几类排序算法快排、堆排、归并排序的复杂度、稳定性是选择题常客偶尔也会让你在编程题里自己实现一个排序并处理大规模数据。字符串与KMP字符串匹配、最长公共子序列、回文子串等编程题高发地带。动态规划背包问题、最长递增子序列、编辑距离基本是必考项。图论拓扑排序、最短路径、并查集出现频率也不低。贪心算法有些题看着像DP实际上贪心就能解关键是要能判断出来。我在刷题的时候会把LeetCode Hot 100和剑指Offer里的中等题刷两遍。第一遍按标签刷第二遍随机抽这样能有效避免“一看题就知道是DP但就是写不出状态转移方程”的尴尬。以排序为例笔试选择题很容易考到下面这张表里的内容排序算法平均时间复杂度最坏时间复杂度空间复杂度稳定性快速排序O(n log n)O(n²)O(log n)不稳定归并排序O(n log n)O(n log n)O(n)稳定堆排序O(n log n)O(n log n)O(1)不稳定插入排序O(n²)O(n²)O(1)稳定冒泡排序O(n²)O(n²)O(1)稳定选择排序O(n²)O(n²)O(1)不稳定快排平均是O(n log n)但最坏会退化到O(n²)。堆排序的建堆过程是O(n)但每次调整堆是O(log n)整体是O(n log n)。这些细节选择题非常爱考千万不要只记一个大概。2.2 字符串与KMP一个容易丢分的点字符串算法里KMP是高频考点。OPPO笔试对字符串的考察很实在KMP、回文串、Trie树都可能出现。很多同学能背出KMP的模板但对“next数组”的理解模棱两可一旦题目把定义变一变直接就蒙了。比如题目里给一个模式串pabacaba让你求next数组。这里要先看清题目里对next的定义。按“next[i]表示前i个字符组成的子串中最长相等前后缀长度”这个约定来算子串a没有真前后缀next[1] 0子串ab前缀a后缀b不相等next[2] 0子串aba最长相等前后缀是a长度为1next[3] 1子串abac没有相等前后缀next[4] 0子串abaca最长相等前后缀是a长度为1next[5] 1子串abacab最长相等前后缀是ab长度为2next[6] 2子串abacaba最长相等前后缀是aba长度为3next[7] 3所以next数组就是0, 0, 1, 0, 1, 2, 3。但要注意有些教材会把next[0]设成-1还有的题目的next数组含义是“失配时跳转到的位置”这时候答案可能就变成-1, 0, 0, 1, 0, 1, 2了。所以做题前先看清楚定义这个真的很重要别在第一步就理解错了。KMP的核心思想其实就一句话利用已经匹配过的信息让模式串尽量多往后跳避免主串回退。理解了这一点再去手写next数组就不容易错了。2.3 机器学习与深度学习基础选择题AI/算法岗笔试和纯后端算法岗笔试最大的区别就是选择题里会掺进大量机器学习和深度学习的知识。OPPO的卷子里这部分比例不低覆盖面也比较广。我遇到的或者听同学提到过的考点有这些损失函数交叉熵与MSE的区别分类问题为什么常用交叉熵而不是MSE。正则化L1正则化为什么会产生稀疏解L2为什么是平滑解。优化器SGD、Momentum、Adam各自的优缺点Adam为什么在很多任务上收敛更快。BatchNorm和LayerNorm的区别前者在batch维度上归一化后者在特征维度上归一化Transformer里用的是LayerNorm。Transformer结构self-attention的计算量随序列长度平方增长为什么会有KV Cache为什么需要位置编码。过拟合的解决手段dropout、early stopping、数据增强、正则化。无监督学习K-Means、PCA、DBSCAN的基本原理。优化算法基础粒子群算法PSO、模拟退火Simulated Annealing这类元启发式算法的原理偶尔也会在选择题里出现。粒子群算法这个点挺有意思热词里有人搜“粒子群算法原理”说明这确实是笔试爱考的。它的核心就三条每个粒子有位置和速度每个粒子记住自己的历史最优位置pbest整个群体有一个全局最优位置gbest。每次迭代更新速度的时候会同时向pbest和gbest两个方向靠惯性权重w控制探索和开发的平衡加速常数c1、c2分别控制“个体认知”和“社会认知”的影响。选择题考到的话基本就是问这些参数的作用或者PSO和遗传算法的区别。模拟退火算法也是一样核心是Metropolis准则算法当前温度较高时即使新解比当前解差也有一定概率接受它这样就能跳出局部最优。随着温度下降接受差解的概率越来越小最后收敛到接近最优解。这个思路在选择题里常考别把它和贪心算法搞混——贪心永远只接受更优解而模拟退火会以一定概率接受劣解。3. 典型题目复盘与解题思路3.1 一道字符串题从暴力到动态规划编程题里我印象最深的一道是“最长回文子串”的变体。题目大概是给定一个字符串求最长回文子串的长度要求时间复杂度优于O(n³)。朴素暴力法是枚举所有子串并判断是否回文复杂度是O(n³)在大数据量下肯定超时。这时候需要想到动态规划。定义dp[i][j]表示从下标i到下标j的子串是否是回文那么状态转移方程就是if s[i] s[j]: dp[i][j] dp[i1][j-1] or (j - i 2)也就是说如果s[i]等于s[j]并且去掉两端后的子串也是回文或者这个子串的长度小于等于3比如a、aa、aba那么dp[i][j]就是True。注意遍历顺序因为dp[i][j]依赖dp[i1][j-1]所以i要从大到小遍历j从小到大遍历。还有一种做法是中心扩展法每一个字符和每两个字符中间都可以作为回文中心向两边扩展时间复杂度O(n²)空间O(1)表现也很稳定。笔试紧张状态下中心扩展法其实比DP更好写对。这道题启发我的是做题先别急着上手写代码先在草稿纸上想清楚暴力解法是O(n³)还是O(n²)再决定要不要优化。能写出O(n²)的DP或者中心扩展这道题基本就稳了。3.2 一道动态规划题01背包的变形还有一道题考的是01背包的变体。题目大意是有一组物品每个物品有重量和价值背包容量有限求能装下的最大价值但每个物品有两个属性限制条件也变复杂了。这种题的底子还是01背包。基础的01背包状态转移是for i in range(n): for w in range(capacity, weight[i]-1, -1): dp[w] max(dp[w], dp[w - weight[i]] value[i])这里有一个非常关键的细节为什么要倒序遍历容量因为dp数组是滚动复用的一维数组如果正序遍历同一个物品会被重复使用就变成完全背包了。倒序遍历才能保证每个物品只取一次。这个点面试时也经常被追问笔试里如果考到01背包写代码时也一定要写对。如果题目加了其他限制比如多了一个“组别”属性每个组只能选一个那就要在每组内部做一次背包DP相当于分组背包。这些都是背包九讲里的经典内容建议在秋招前把背包装包问题从头到尾梳理一遍。3.3 简答题考察的不只是背诵有些批次的笔试会有一两道简答题。我听说有的同学遇到的问题是“如何在大规模数据下训练一个深度学习模型”这就是典型的工程落地题。这种题没有标准答案但阅卷人会看你的逻辑链条是否完整。我的回答思路是分几步走数据层面数据清洗、采样均衡、数据增强必要的时候做数据去重避免模型见过太多重复样本。模型层面如果预训练模型太大考虑蒸馏、裁剪、量化、低秩分解等压缩手段。训练层面梯度累积、混合精度训练AMP、DeepSpeed的ZeRO优化、模型并行和数据并行。推理层面ONNX导出、TensorRT优化、批量推理、缓存机制。这种回答方式既展示了知识广度又体现了工程意识。OPPO毕竟有端侧AI和影像算法业务面试官对“模型如何在手机端跑起来”这类问题会很感兴趣简答题里出现相关考点完全正常。3.4 元启发式算法粒子群与模拟退火前面提到粒子群和模拟退火这类算法在笔试中虽然不会单独出编程题但选择题里出现的概率不低。尤其是“粒子群算法原理”这个热搜词让我意识到关注这个点的人很多因为它本身就是一个容易混淆的知识点。粒子群算法最核心的更新公式是v_i w * v_i c1 * r1 * (pbest_i - x_i) c2 * r2 * (gbest - x_i) x_i x_i v_i这里的w是惯性权重决定粒子对原有速度的保持程度c1和c2是学习因子r1和r2是[0,1]之间的随机数。如果w比较大粒子倾向于大范围探索如果w比较小粒子会在局部精细搜索。写选择题的时候看到“全局搜索能力不足”想到调大w看到“收敛太慢”想到调大c1和c2这个逻辑基本能应付80%的题。模拟退火的核心也简单初始温度高接受差解的概率大温度逐渐降低接受差解的概率变小最后趋于稳定。这里“以一定概率接受差解”是关键也是和贪心的根本区别。KMP是字符串匹配的“后悔药”模拟退火就是优化问题的“反悔机制”。4. 计算机基础与AI理论的混合考查4.1 操作系统与网络老生常谈但必考虽然投的是AI/算法岗但OPPO笔试里还是会有一些计算机基础题。这其实很正常任何技术岗都默认你掌握了基本的操作系统和网络知识这部分答不好会拉低整体印象分。操作系统高频考点进程与线程的区别进程间通信方式管道、消息队列、共享内存、信号量、Socket。死锁产生的四个必要条件互斥、占有并等待、不可剥夺、循环等待。虚拟内存与页面置换算法LRU、FIFO、Clock算法重点理解LRU为什么是最常用的因为它的局部性假设最好。用户态和内核态切换发生的时机。网络高频考点TCP三次握手和四次挥手。四次挥手里TIME_WAIT状态为什么要等2MSL这个选择题特别爱考核心是为了保证最后一个ACK能到达对方以及让旧连接上的延迟报文自然消失。HTTP与HTTPS的区别HTTPS在HTTP与TCP之间多了一层TLS/SSL协商密钥的过程要知道。DNS解析全过程。从浏览器缓存、本地hosts、本地DNS服务器一路问到根域名服务器这个流程在笔试里出现过不止一次。这些内容不需要复习到什么深度但核心概念必须准确。不然选择题四个选项里三个听过、一个没见过选来选去很容易掉坑。4.2 AI理论考点损失函数到TransformerAI理论这块是拉开差距的地方。除了前面提到的优化器和正则化还有几个点在笔试选填里出现频率很高。交叉熵损失。多分类问题里交叉熵配合softmax是标配。有些题会问为什么MSE在分类任务中效果不好因为sigmoid输出遇到MSE时梯度会包含sigmoid的导数项在两端接近饱和时梯度趋近于0收敛特别慢。交叉熵没有这个饱和区问题。KL散度和ELBO。这在VAE和变分推断相关题目里会出现。ELBO的公式是ELBO E_q[log p(x|z)] - KL(q(z)||p(z))含义是“重建误差”和“隐变量分布与先验分布的差距”之和。最大化ELBO等价于最小化负ELBO也就是VAE的损失函数。热词里有人搜“kl elbo 算法原理详解”说明这个点确实让人头大笔试一旦考到就是纯理解题。Transformer的self-attention。Attention(Q,K,V) softmax(QK^T / sqrt(d_k)) V除以根号d_k是为了防止点积结果过大导致softmax落入饱和区。复杂度是O(n²d)。这个公式是AI/算法岗笔试必背几乎没有任何商量的余地。分布外检测OOD和域泛化这类前沿概念偶尔会作为多选题出现。不用复习得太深但至少要知道它们是解决“训练分布和测试分布不一致”问题的手段。4.3 编程语言与工程细节还有一类题考的是编程语言本身。比如Python的GIL机制、深浅拷贝的区别、C的vector扩容机制、static关键字的作用、智能指针的原理。这些题和算法岗的日常工作息息相关写高质量代码时躲不开。Python里要注意的不多但GIL是真高频。GIL让同一进程下的多个Python线程无法真正并行执行CPU密集型任务所以多线程适合IO密集多进程才适合CPU密集。C这边vector扩容一般是1.5倍或2倍增长这个倍数和内存分配策略有关选择题里如果问“vector push_back均摊时间复杂度”答案就是O(1)。5. 复盘与避坑写给准备下一轮笔试的你5.1 笔试环境的坑先说一个真人真事。有个同学收到笔试邮件之后没提前测摄像头和浏览器结果开考前才发现自己的Chrome版本太老导致监控插件加载失败。折腾了半天换浏览器、清理缓存等他进入答题页面的时候已经过去快二十分钟了。本来题量就大再少了二十分钟心态直接崩了。所以收到笔试邮件后第一件事不是刷题而是先做环境测试。检查摄像头能否正常打开麦克风是否被其他软件占用浏览器是否为最新版本网络是否稳定电脑是否要插电源。如果家里网络不稳提前准备好手机热点。这些细节看起来蠢但每年都有人在这里栽跟头。5.2 写代码时的输入输出问题编程题输入输出的处理是另一个大坑。力扣是“填函数”牛客是“完整程序”很多同学在笔试时根本不适应后者卡在sys.stdin.readline()上。Python读多行输入我习惯这样写import sys def solve(): lines sys.stdin.read().split() # 按需解析 lines 中的数据 ... if __name__ __main__: solve()用sys.stdin.read()一次性把全部输入读进来再split比一行行input()要稳尤其在有大量数据的时候。C的话注意cin配合ios::sync_with_stdio(false)和cin.tie(nullptr)加速否则大数据量下可能超时。读题的时候还要注意输入边界。比如节点编号是从0开始还是从1开始字符串里是否包含空格是否有多个测试样例输出格式对浮点数保留几位。这些细节一个不注意写出来的代码就可能对不上。5.3 选择题不要恋战选择题里最怕的就是恋战。一道多选题看了两分钟还不知道选什么这时候就应该先蒙一个标记下来等做完编程题再回头想。反正计算机判分靠蒙也有概率拿分死磕只会压缩后面的时间。多选题还有个技巧拿不准的选项不选。很多多选的计分规则是“少选得部分分错选得0分”这种情况下宁可少选也不能选错。如果你不确定某个选项对不对干脆别勾它。5.4 复习重点建议怎么准备更高效从这次笔试复盘来看想稳过OPPO AI/算法岗笔试至少要覆盖这四条线刷题线LeetCode Hot 100熟做剑指Offer刷一遍动态规划和字符串题重点练。笔试题很少超出这两个范围太远。机器学习和深度学习理论线李航《统计学习方法》前几章、吴恩达机器学习课程、以及一篇Transformer讲解比如《Attention Is All You Need》原文或各类高质量博客。重点搞懂损失函数、正则化、优化器、注意力机制。计算机基础线操作系统、网络、数据库基础不用太深但核心概念要能用一句话解释清楚。工程落地线建议了解模型压缩、知识蒸馏、量化的基本思路这在OPPO这类有端侧AI业务的公司笔试和面试里都是加分项。复习时间安排上我建议考前一周集中做两个事一是把LeetCode里做过的题按标签快速过一遍尤其是DP、贪心、字符串、图二是把机器学习基础概念过一遍用“给别人讲一遍”的方式来检验自己是否真的理解了。能讲清楚才能考明白。5.5 笔试之后的心态调整笔试结束后先别急着对答案更不要因为一两道选择题没把握就焦虑。笔试只是秋招这条路上的一站它起到的是筛选作用不是要求你考满分。我身边进了面试的同学大多数也不是笔试满分选手而是基础扎实、编程题稳、没有因为环境问题翻车的人。我个人在实际操作中的体会是OPPO这场笔试真正筛掉的不是不会做难题的人而是基础不牢、节奏混乱、甚至环境都没准备好的人。只要前期刷题量够机器学习基础概念清楚把该拿的分拿到进入面试的机会就很大。如果你正在准备下一场笔试请务必把时间花在“完整刷一遍高频题 吃透高频理论点”上而不是焦虑地刷手机看面经那才是真正拉开差距的地方。
返回列表