ARTICLE DETAIL

资讯详情

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

商汤校招笔试复盘:AI公司笔试考点与备考策略全解析

商汤校招笔试复盘:AI公司笔试考点与备考策略全解析 2018年我参加了商汤科技校招笔试第二场投递的是后端方向但卷子拿在手里一翻C/C、算法开发、大数据、数据挖掘、运维、测试的题目全在里面。很多同学考完回到群里第一句话都是这考的是同一个岗位吗。其实这场笔试很典型它不会只考你投递的那个方向而是把计算机基础、数据结构、算法、机器学习基础和工程经验全部压在两个小时里。距离现在有些年头了但当年这套笔试的考点结构、难度层次和坑点对今天准备AI公司校招笔试的同学依然很有参考价值。我结合自己的回忆和后来复盘整理的笔记把这场的考点、答题策略和备考思路完整梳理一遍适合正在准备算法、后端、大数据、运维或测试方向校招的同学参考。先说结论这场笔试的考点可以大致分成四类——C/C与算法题、数据挖掘与机器学习基础题、大数据与分布式原理题、后端/运维/测试的工程基础题。不同岗位的侧重点不同但底层要求是一致的代码能力过关、基础概念扎实、能在有限时间内做出取舍。下面我按实际做题的顺序和优先级逐块拆解。1. 一张卷子筛七个岗位命题逻辑其实很清晰1.1 岗位标签不同公共考点高度重合笔试通知上写了C、算法开发、大数据、后端、运维、测试、数据挖掘七个方向看起来很分散但商汤这类AI公司有天然的命题逻辑不管什么岗位都需要候选人具备基本的编程能力、数据处理能力和系统认知。所以整张卷子虽然分模块公共考点却异常集中。选择题部分几乎绕不开这几类C/C语言细节、数据结构与算法复杂度分析、操作系统进程线程、网络协议基础、数据库SQL、概率统计与机器学习基础。这些在七个岗位里都会出现只是权重不同。比如C岗和算法开发岗对C语言细节考察更深大数据和数据挖掘岗会多出分布式原理和特征工程的题运维岗在Linux命令和网络排查上更细测试岗则集中考用例设计和边界分析。我当时的判断是试卷命题人是按统一命题 岗位侧重组卷的方式出题的不是每个岗位单独出一套完全不同的题。这意味着你哪怕只复习自己投递的那个方向公共基础部分也会占掉至少一半的分数。所以备考重点不是死磕某一门而是先把公共底子打牢。1.2 为什么AI公司这么执着于C/C很多同学不理解商汤是做计算机视觉和AI平台的为什么笔试要考C/C其实很简单AI框架的底层推理引擎、训练框架的算子实现、数据预处理的管线大部分是用C写的某些性能关键路径甚至直接写CUDA。后端服务虽然可以用Python/Java写业务逻辑但上层框架调用的底层库就是C。所以C/C是AI公司技术栈的地基。我当时投后端也拿到了一张需要写C的卷子没有任何因为投后端就可以绕开C的空间。建议不管投哪个方向C的基础语法、指针与内存管理、STL容器、类与继承、智能指针这些内容必须过一遍。这对后端、算法、数据岗位都通用。2. C/C与算法题笔试里最硬的一块骨头2.1 数据结构与算法的高频考点分布这一部分我回忆里占比很重至少有30%到40%的分数分布在算法题和数据结构选择题上。高频考点大致是链表相关操作反转、环检测、合并有序链表、二叉树遍历与重建、动态规划背包、最长递增子序列、编辑距离、字符串处理逆序、匹配、最长回文子串、排序与二分查找变体、哈希表应用。商汤笔试里比较有区分度的是字符串处理与模拟题。因为视觉AI公司处理大量非结构化数据字符串操作是基础中的基础。像字符串逆序输出这种经典题虽然简单但笔试里会包装成字符串按单词反转且不改变单词内部字符顺序之类考察对边界情况的处理。我印象里有一道类似的题目分值不小当时要求写完整函数而不是写伪代码还要注意原地操作和空间复杂度。这类题如果平时刷过LeetCode基本拿到就能写所以刷题量在这一轮里是硬通货。2.2 语言细节比LeetCode更刁钻LeetCode刷习惯了最怕的是笔试选择题里的C细节题。商汤的C题目不考这份代码输出什么这种简单题而是考为什么。比如拷贝构造函数和赋值运算符重载在什么场景下会被隐式调用、浅拷贝和深拷贝在容器中会引发什么问题、虚函数表在继承链上如何分布、智能指针的引用计数是否线程安全。有一道题我一直记得问的是下面哪种情况下拷贝构造函数会被调用选项里有函数传参、函数返回对象、直接用另一个对象初始化、赋值操作。正确答案是前三个赋值操作调用的是赋值运算符重载而不是拷贝构造。这类题如果不把C对象模型搞透很容易栽。还有一类是内存管理题问野指针、悬空指针、内存泄漏的成因和排查方法。这些在笔试里是送分题但很多刷题刷得多、工程经验少的同学反而答不准确。我的建议是笔试前系统过一遍C内存模型和对象生命周期比多刷20道LeetCode更划算。2.3 手写代码题的考场边界笔试的编程题和LeetCode有一个很大区别考试系统不会给你友好的编译器提示边界条件错了就是错了。我参加的那场笔试用的是在线OJ系统代码写完提交直接判分用例跑不过就是零分没有部分通过的梯度部分系统可能按例给分但不确定的最好事前确认。所以手写代码时边界条件必须自己提前想清楚数组为空、链表只有一个节点、目标值不存在、字符串里有空格、整数溢出。我当时的策略是先写暴力解保证拿分再在当前代码上优化而不是一上来就写最优解。因为在线OJ的重点是AC不是炫技。暴力解能过部分用例比一个写不完的最优解强得多。另外注意编译环境。当时考场的编译器版本比较老C11的特性部分支持auto、unordered_map这些能用但C17的结构化绑定就别想了。考前最好用和在线OJ一致的编译器版本跑一跑避免出现在本地跑得好好的、考场编译不过的情况。3. 数据挖掘与大数据方向的题目考的不是调参3.1 概率统计和机器学习基础题复盘数据挖掘和算法岗位的公共部分集中在概率统计、机器学习和基础数学上。商汤作为AI公司这部分很看重尤其是概率题几乎年年有。比如朴素贝叶斯分类器中的条件概率计算、贝叶斯公式应用题先验概率加观测结果求后验概率、期望与方差的计算、常见分布正态、伯努利、泊松的性质。我考场上遇到了一道贝叶斯公式的题给了一个分类场景的混淆矩阵要求计算精确率和召回率再结合先验概率算后验。这道题本身不难但时间紧容易慌平时如果不熟悉精确率、召回率、F1、ROC这些评估指标的公式和实际含义很容易在选项里绕晕。机器学习基础选择题的范围我整理了大概监督学习与无监督学习的区别、过拟合与欠拟合的成因和应对方法正则化、交叉验证、数据增强、损失函数的选择与梯度下降的关系、KNN的K值选择、决策树的分裂准则信息增益、基尼指数、SVM的核函数。这类题不深但覆盖面广考前把常见算法的原理过一遍很有必要。3.2 SQL与特征工程题容易被低估的实战项数据挖掘的笔试里偶尔会穿插SQL题比如经典的学生选课表查询找出所有选了某两门课的学生、统计每门课的选课人数、用窗口函数算排名。商汤那场笔试的SQL题难度不高考的是基本的JOIN、GROUP BY、子查询以及窗口函数如ROW_NUMBER()、RANK()的用法。如果你投的是大数据或数据挖掘岗位SQL几乎是必考的。这里有个容易被低估的点很多人会写单表查询但一到多表JOIN和子查询就容易卡壳。建议把三张表以内、带聚合和条件过滤的SQL题刷熟窗口函数单独练一遍。笔试界面不支持本地调试SQL写得对不对全凭经验所以考前尽量在本地用真实数据库练别干看题目。特征工程的题也有我记得给了几个特征问哪些属于类别特征、哪些需要归一化、缺失值用什么方式处理比较好。这题考的是工程经验不是在书本上能背到的。基本共识数值型特征通常需要归一化或标准化类别型特征用one-hot或标签编码缺失值不多时可以用众数/中位数填充缺失多时可以考虑单独作为一类。3.3 大数据组件与分布式原理从MapReduce到Spark大数据方向的题比想象中更偏向原理理解而不是框架API记忆。比如MapReduce的shuffle过程、数据倾斜的解决方案、HDFS的读写流程、Spark RDD的依赖关系与血缘、宽窄依赖的区别、checkpoint的作用。这些题的核心是用一种组件问分布式系统里最本质的思想数据分片、并行计算、容错、数据本地性。商汤笔试的大数据题量不算特别大但每一道都问得比较深。比如Spark中宽依赖和窄依赖的区别这道题很多人答得出宽依赖是多个子RDD分区依赖同一个父RDD分区、窄依赖是每个父RDD分区最多被一个子RDD分区使用但要再追问宽依赖为什么会导致stage划分、为什么会产生shuffle就容易卡壳。所以复习时不要只记结论要把结论背后的原理链条打通。大数据常规考点还有HBase的RowKey设计原则、Kafka的消息可靠性保证、Zookeeper在分布式协调中的作用、数据仓库分层ODS/DWD/DWS/ADS的设计思路。这些内容在大数据面试题这个热搜词里被反复提及说明大家普遍觉得不好准备。我觉得关键是建立一个完整的分布式系统认知框架再往框架里填组件细节而不是一个组件一个组件孤立地背。4. 后端/运维/测试方向看似送分实则容易翻车的考点4.1 网络协议与Linux命令必须拿满分的模块后端、运维、测试方向有一块公共内容就是网络和操作系统基础。TCP三次握手和四次挥手、TCP与UDP的区别、HTTP/HTTPS的握手过程和状态码含义、DNS解析过程这些基本必考。商汤笔试在这方面没有出太偏的题都是经典中的经典但正因为经典很多人一眼瞄过去以为会真正做起来才发现细节记混了。我印象比较深的是HTTP状态码的题问301和302的区别403和404的区别500和502的区别选项里混着一些比较冷门的状态码。这类题没有技巧靠的就是准确的记忆。建议把常见的1xx到5xx状态码完整过一遍尤其要分清301、302、307、308这四个重定向状态码在语义上的差别。Linux命令也是必考项。运维方向会更细比如查找文件用什么命令、查看端口占用用什么命令、查看进程用什么命令、df和du的差别、grep/awk/sed的用法。这里我提醒一句这些命令在真实工作中和笔试里完全是两回事。笔试考的是选项里哪个命令能实现XX功能你必须准确知道每个命令的细节不能靠猜。考前把常用的文件操作、网络排查、进程管理、磁盘管理命令过一遍性价比很高。4.2 数据库索引与事务后端必拿分项后端岗位的笔试里数据库占比不低。高频考点是索引失效的场景最左前缀原则、隐式类型转换、like以%开头、聚集索引和非聚集索引的区别、事务的ACID四特性、四种隔离级别以及各自能解决什么问题脏读、不可重复读、幻读、MVCC机制。我记得有一道题给了几条SQL问哪些会走索引、哪些不会。这种题很容易错因为会不会走索引取决于执行计划跟数据分布和优化器有关笔试只能按“最典型的情况”来答。比如WHERE name LIKE %abc%这种前模糊匹配通常不会走索引这个结论要记住。但实际工作中如果数据量特别小MySQL可能全表扫描比走索引还快优化器会选择不走索引。笔试看的是通用结论别拿个例较真。事务隔离级别的题我建议用表格梳理一遍隔离级别脏读不可重复读幻读READ UNCOMMITTED可能可能可能READ COMMITTED不会可能可能REPEATABLE READ不会不会可能InnoDB下可避免SERIALIZABLE不会不会不会MySQL InnoDB引擎的默认隔离级别是REPEATABLE READ但它通过间隙锁和MVCC在多数情况下也能避免幻读这个点如果面试被追问到是很好的加分项。4.3 测试岗位的用例设计思维不写代码也能拉开差距测试方向的笔试关键在于有没有测试思维。商汤的测试题不会问你要不要做自动化测试而是给你一个功能场景让你设计测试用例。比如一个登录接口你在有限时间内能写出多少用例里面有没有考虑SQL注入、密码明文传输、账号锁定策略、验证码过期、并发登录——这些全是加分项。等价类划分和边界值分析法是笔试里最常用的方法。边界值几乎逢考必出一个输入框允许1到20个字符那你至少要测0、1、20、21个字符这四种情况外加全角半角、中英文、特殊字符、超长字符串、纯空格。这类题只要平时建立过正常流异常流边界情况安全测试的用例框架基本能拿七成以上的分。很多投测试的同学会担心我不会写代码笔试会不会吃亏。实际上商汤那场笔试的测试方向编程题难度略低于C/算法岗位更看重逻辑性和覆盖度。但如果你会Python写几个基础脚本会大大加分比如用requests库模拟接口请求、用pytest写简单断言。测试工程师不是“不写代码”而是“写更偏业务逻辑的代码”这个观念要提前转过来。5. 考场上的时间分配与答题顺序我踩过的坑5.1 先全局扫题再按投入产出比排序笔试两个小时时间分配是决定成败的关键。我当时的策略是先花三分钟把整张卷子扫一遍搞清楚题目分布和分值再决定做题顺序。这个策略很重要因为试卷把难点放在前面还是后面不一定闷头从第一题做到最后一题很容易卡死在前面某道难题上后面明明有简单的题却没时间写。我的做题顺序是先做有把握的选择题再做熟悉的简答题和编程题最后啃难题。选择题里有一种情况很头疼——多选。不确定的选项宁可不选也不要选错。很多在线笔试的多选题是少选得部分分错选得零分所以不确定的选项不勾比勾上更划算。5.2 编程题卡住时的抢分思路编程题卡住是最痛苦的。我当时遇到一道链表相关的题本来以为简单结果写着写着发现漏了一种情况。这种时候我的做法是先在注释里把思路写完整再实现一个能过基础用例的版本最后再补优化。哪怕优化的部分没写完至少能保证拿基础分。还有一点如果编程题实在做不出来不要空着。把题目要求读完把输入输出的边界条件写在注释里或者写一个只能处理部分情况的解很多评分系统是按通过的测试用例数量给分的暴力解能过几个用例也比交白卷强。我曾经参加过一场笔试有一道动态规划题没写出最优解但暴力递归过了50%的用例最后照样进了面试。5.3 环境与工具的坑在线笔试的环境问题也值得一提。当时有同学反映本地编译可以通过提交后却编译失败原因是头文件引用路径不同、编译器版本不支持某些语法或者代码里用了本地才有的配置。建议考前提前熟悉在线OJ的界面和提交逻辑哪怕只是做一道ab测试一下环境也能避免考场上手忙脚乱。还有一个容易被忽略的坑输入输出的格式。有些题目要求输出保留两位小数有些要求字符串按字典序输出有些要求多组输入以EOF结束。这些细节写错了哪怕算法完全正确也拿不到分。平时的刷题习惯要养成用标准输入输出写题的模式不要依赖IDE的断点和调试。6. 笔试之后从考场复盘反推系统准备路线6.1 一面大概率从你的错题开始复盘比分数更重要笔试结束后很多人就开始等通知完全不回顾自己哪里做错了。我的经验是笔试之后的复盘对你的面试价值比笔试本身还大。因为面试官手里是有你笔试答案的面试开场很可能会挑你答错或答得不好的题追问。我当时笔试在Spark宽窄依赖是否会影响stage划分这题上回答得不够准确面试时真的被追问了。好在笔试结束后我翻了资料把这个点补上了面试时能够说得比较完整。所以考完不管自我感觉好坏趁记忆还在第一时间把题目回顾一遍尤其是自己不确定的选择题和编程题去查清楚正确答案和原理这比打开面经背题有用得多。6.2 不同岗位的后续复习侧重点复盘完错题接下来就是按岗位方向、针对性地补课。给一个可以抄作业的路线参考方向复习重点建议资源C/C指针与内存、STL、对象模型、编译链接《深入理解计算机系统》相关章节 刷题算法开发数据结构、动态规划、图论、机器学习基础LeetCode 《统计学习方法》大数据分布式原理、Spark/Hadoop/Hive、SQL组件官方文档 大数据面试题整理后端网络、操作系统、数据库、Redis、Linux《图解HTTP》 牛客网后端题库运维Linux命令、网络排查、Shell脚本、监控体系实操为主在虚拟机里多搭环境测试用例设计、接口测试、自动化基础一门Python pytest 常见用例设计题这个表格不是让你逐项无脑执行而是结合自己的薄弱项挑重点。如果你的目标是后端那么网络和数据库是必须拿下的如果你的目标是数据挖掘那么SQL和机器学习基础不能拖后腿。6.3 用真题复盘法代替无脑刷题最后想分享一个我的备考思路转变。刚开始找工作时我的方法是疯狂刷题从早到晚刷LeetCode但效果不好因为刷过的题过几天就忘。后来我改成真题复盘法每做完一套笔试或面试题不仅要订正答案还要把每道题对应的知识点、当时为什么错、怎么避免再错这三件事写下来。两周以后回头翻一遍效果比盲目刷题好很多。商汤这场笔试对我最大的影响不是帮我拿到了某个offer而是让我意识到校招笔试考的不是你记住了多少知识而是你在有限时间、有限信息下的判断力和执行力。很多题目你并不是不会而是没有时间做、没有信心做、没有策略做。提前习惯这种考试节奏比临时抱佛脚刷几百道题来得更实在。如果你下周就要参加类似的AI公司笔试我的最直接建议是把C基础再过一遍、把SQL窗口函数练熟、把复杂度和边界条件的意识刻在脑子里剩下的交给平时的积累和考场的冷静。祝顺利。
返回列表