
周六上午九点我打开了商汤科技2018校招笔试第一场的线上答题页面。那一场笔试覆盖C/C、算法开发、大数据、后端、运维、测试、数据挖掘七个方向题量大、时间紧、细节多整体难度在当年AI公司校招笔试里算中上水平。后来我转做技术面试官再回头看这场笔试发现它考的从来不只是知识点的堆砌而是你对真实工程问题的拆解能力。这篇复盘不打算回忆具体的原题更多是想告诉你商汤这类AI公司的笔试到底在筛选什么样的人。如果你正准备投AI算法、平台开发、大数据或测试运维方向这篇内容能帮你快速理解笔试的考察逻辑避开我当年踩过的坑。就算你不是校招生只是想在简历里增加一些项目底气和基础能力这套复习思路同样适用。1. 商汤这场笔试的整体思路与考察逻辑1.1 一张试卷覆盖七个岗位方向商汤科技本身是做AI视觉起家的核心业务是计算机视觉算法在安防、智慧城市、自动驾驶等场景的落地。2018年校招这场笔试明显是给整个技术岗线准备的C/C、算法开发、大数据、后端、运维、测试、数据挖掘七个方向的题目混在一起要求你根据自己的意向岗位选择作答。所以它的考核逻辑和普通后端公司的笔试不太一样底层语言、算法思维、数据处理能力是公共基础然后再按方向看你的专业深度。我当时选的是算法开发方向但后来跟投C方向的朋友对过题发现很多基础题是重叠的。比如指针题、内存管理题、字符串处理题不管哪个方向都出现。这说明商汤并不希望你只会调库而是要求你理解底层。AI模型对外是Python落到线上推理和训练框架C/C是绕不开的而数据挖掘、大数据方向的岗位本质上也是在处理海量数据和算法岗共享同一套数据结构和分布式基础。1.2 题量、时间线与分数分布先给一份我印象中的试卷结构供参考部分题型大概题量分值占比公共基础单选/多选30道左右30%C/C专题填空/编程10道左右20%算法编程在线编程2~3道25%大数据/数据挖掘简答/场景题5道左右15%后端/运维/测试简答5道左右10%120分钟题目总数量不少。我印象最深的不是题目本身而是时间不够用。很多人前30道选择题做完已经快40分钟后面的算法题完全没时间写。所以第一件事就是学会放弃。选择题遇到不会的按“第一直觉选一个然后标记”绝不在单题上耗超过3分钟。这套结构本身就在筛人它考的不仅是你会不会而是你在压力下怎么分配资源。这其实跟实际工作很像——AI项目迭代节奏快很多时候你不可能把每个细节都弄清楚了再动手。1.3 商汤为什么要这样出题从我后来做面试官的角度回看这场笔试其实是在答三个问题第一你有没有扎实的语言底层基础。AI算法工程师在业务上大量用Python但一旦涉及高性能推理、算子优化、线上服务就必须懂C/C底层的内存分配、指针使用、缓存友好性。第二你有没有清晰的算法思维。模型训练的本质是优化问题而笔试里的动态规划、图论、树形结构考察的是你建模和求解问题的能力。第三你具不具备工程化处理数据的能力。大数据和数据挖掘方向的题目就是在模拟海量数据下的真实瓶颈。所以不要只把这场笔试当成一个“过关”任务它其实是职业方向的一次预演。你能通过它说明你的基础能力已经匹配AI研发岗位的底层要求。2. C/C方向的核心考点与答题策略2.1 指针与内存管理是必考题C/C岗位的笔试里指针和内存管理几乎占了半壁江山。那一场我记得有一道题要求手动实现strcpy看起来简单但很多人在细节上翻车。标准写法讲究四点源字符串要加const约束防止不小心修改源数据先判断传入指针是否为空避免空指针解引用返回值要返回目标指针方便链式调用用while循环赋值到\0结束。很多考生会把第四点写成for循环还会多复制一个结尾符导致串末尾多一个无效字符。这种细节就是拉开差距的地方。我的建议是笔试前把strcpy、strlen、strcmp、memcpy这几个经典函数自己手写一遍不要看答案。写完之后再用各种边界测试用例去验证空字符串、空指针、目标地址和源地址重叠等。你亲手踩过这些边界坑后笔试时再遇到类似题几乎不超过3分钟就能写完。2.2 字符串与数组操作里容易被忽略的细节字符串和数组是C/C笔试的常客。那场笔试有一道很典型的题字符串逆序输出而且要求尽量原地完成。核心思路是用双指针一个指向开头一个指向结尾交换两个位置的字符然后逐步向中间移动直到两个指针相遇。void reverse(char *s) { if (s NULL) return; char *left s; char *right s strlen(s) - 1; while (left right) { char tmp *left; *left *right; *right tmp; left; right--; } }这道题真正注意的点有两个。一是遇到中文等多字节字符不能直接简单交换因为UTF-8下的一个汉字占3个字节按字节翻转会得到乱码。笔试时如果题目没强调编码可以先假设ASCII但我通常会主动补一句“如果包含多字节字符需要按字符边界处理”这个细节会加深面试官印象。二是数组越界问题函数里如果不做空指针判断传入空字符串时strlen已经为0再减1就变成负数导致指针越界这是最常见的崩溃点。2.3 编译、链接与运行时的基础题C岗位还会考编译链接相关的知识点比如static关键字的不同作用域、extern的作用、sizeof和strlen的区别、动态链接和静态链接的差异。商汤这类做深度学习框架的公司对编译链接机制是很看重的因为在线推理服务对性能要求高链接方式、内存布局都直接影响运行效率。我看过不少候选人刷题刷得很熟但一问到sizeof一个结构体要考虑字节对齐就答不上来。这类问题虽然偏底层但在实际开发中很常见比如设计一个共享内存结构体时字段顺序没排好会白白多占内存在GPU和CPU之间传数据时没处理好对齐性能会明显下降。所以准备笔试时建议把《C Primer》里关于类型大小、内存布局、编译过程的章节过一遍不要只看八股文。3. 算法开发方向的解题思路与常见题型3.1 数据结构基础题链表、二叉树、栈与队列算法方向的题目相对传统链表反转、二叉树遍历、用两个栈实现队列这类题几乎每年都出现。链表反转特别容易考而且常常要求递归和迭代两种写法都写出来。递归写法三行就能搞定但很多人递归出口写错迭代写法则经常忘记保存下一个节点导致链表断裂。我练习时会把这类基础题分成两类一类是“结构型”比如链表反转、树的镜像核心是掌握指针/引用的操作另一类是“状态型”比如二叉树层序遍历、最近公共祖先核心是理解状态转移。只要有意识地分类刷题而不是一道一道孤立地刷到笔试时面对陌生题就能很快找到对应的“解法模板”。3.2 动态规划与图论笔试里的分水岭如果只准备数据结构题可能过不了商汤那次笔试的算法部分。动态规划和图论是真正卡人的地方。我记得那场有一道比较典型的题给定一个矩阵从左上角到右下角每次只能向右或向下走求路径上的最小和。这就是最基础的二维DP状态转移方程是dp[i][j] grid[i][j] min(dp[i-1][j], dp[i][j-1])初始化时把第一行和第一列处理好边界条件就能写对。这类题我建议按套路准备先判断能不能拆分子问题、有没有重叠子问题再设置DP数组明确每个下标代表什么含义接着写状态转移方程最后处理初始化。不要一上来就暴力搜索那样在时间限制内基本跑不完。3.3 答题顺序与复杂度控制技巧算法题部分通常有2~3道分值占比很高。我的经验是先扫一眼所有题按照“思路清晰程度”排序先做最有把握的题。商汤这类AI公司的笔试对时间复杂度有明确限制比如O(n)和O(nlogn)能过O(n^2)直接超时所以写代码前先在草稿纸上估算复杂度。一个很实用的检查方法看一眼数据范围如果n是10^5级别你的算法复杂度最好控制在O(nlogn)以内如果n是10^3级别O(n^2)还可以接受。这个判断能力在真实工程里也很重要因为线上数据量往往比本地测试大很多一个看似能跑的算法一上真实数据就崩。笔试就是这种思维模式的最小化模拟。4. 大数据与数据挖掘方向的关键技术点4.1 海量数据处理哈希分治、位图与布隆过滤器大数据和算法方向在商汤笔试里有很多交叉但大数据方向更侧重于海量数据场景下的处理思路。那场笔试有一道经典题给定一个非常大的日志文件求出现次数最多的TOP 10 IP。直接排序显然不现实标准答案是哈希分治把大文件按IP哈希到多个小文件中再对每个小文件统计IP出现次数最后归并出全局TOP K。海量数据处理还有一个高频考点是布隆过滤器用来判断一个元素是否在集合中。它的核心思想是用多个哈希函数把元素映射到位数组上缺点是存在误判但可以大幅节省内存。这类题的吸引人之处在于它考察的不是你会不会某个框架而是你面对数据量超过单机内存时如何设计一个合理的处理流程。这就是大数据工程师每天都在做的事。4.2 数据挖掘基础模型与特征工程数据挖掘方向的笔试会偏向特征工程和基础模型。常见问题包括给出一个二分类任务如何处理缺失值、连续特征离散化、类别特征编码逻辑回归和决策树各自的优缺点评估指标里准确率、精确率、召回率、F1怎么选择。那一场记得考了一道关于特征选择的题问在特征维度很高的情况下如何筛选有效特征我写了基于方差过滤、相关系数和树模型特征重要度的组合方案。这里我想强调一点答这类题不要只写概念要主动结合业务场景。比如笔试问你为什么用LR做CTR预估你除了说LR简单可解释还可以补一句“因为在在线学习场景下LR的参数更新可以和Spark Streaming或Flink衔接工程实现成本低”。这类回答在面试官眼里非常加分因为它说明你不只是背过模型原理而是考虑过落地。4.3 大数据平台与SQL能力大数据方向的笔试题还会涉及Hadoop/Spark生态。最基础的有MapReduce的Shuffle阶段做了什么、Spark RDD的依赖关系、数据倾斜怎么解决。这些题看似八股但其实对应着线上真实的性能问题。数据倾斜那一类我的标准回答是先定位是Group By倾斜还是Join倾斜然后从加盐、广播小表、拆分热点Key几个维度处理。SQL题目也很重要尤其是窗口函数的运用。当年那场有一道题统计每个用户连续登录的最大天数。这类题用SQL写比较绕思路是给每个用户按登录日期排序然后用登录日期减排名得到一个临时分组键连续登录的记录临时键相同最后按用户和临时键分组统计天数即可。窗口函数row_number()、rank()、lag()这些一定要用熟数据岗笔试基本跑不掉。5. 后端方向考点与系统设计思维5.1 网络、并发与进程线程基础后端岗位的题目比算法岗更偏工程化。TCP三次握手的流程、HTTP和HTTPS的区别、进程和线程的区别、线程池参数怎么设置这些属于必背基础。那场笔试有一道题是有一个接口特别慢但CPU和内存使用不高应该如何排查。我当时的回答是先看有没有外部调用超时再看数据库慢查询再看线程池是否被占满最后看锁竞争。后来我做面试官发现这道题其实是在考察排查思路的系统性而不是考察具体工具。并发相关的题也经常出现比如写一个线程安全的单例、手写一个简单的生产者消费者模型。这些问题看起来简单但代码里的细节很多。比如线程池的核心线程数怎么设我的经验是CPU密集任务设为核心数1IO密集任务适当调大同时要考虑队列容量和拒绝策略。这些经验不是刷题能刷出来的最好是在实际项目里跑过一两个并发场景再上考场。5.2 数据库与缓存的底层逻辑后端笔试必考数据库索引和缓存。为什么InnoDB用B树而不是哈希索引因为B树支持范围查询而哈希只支持等值查询为什么Redis快因为它是基于内存的单线程模型避免了多线程切换和锁竞争的开销。这些道理说起来简单但很多人不会深入一层比如为什么B树的非叶子节点不存数据而是为了增加单层节点能容纳的键数量、降低树高、减少磁盘IO次数。对于Java后端方向的同学那场笔试还涉及了Spring Boot的常用注解、前后端分离项目里的接口设计等。这里我有一个建议八股题目的答案要尽量“往底层说”。比如问到Spring的IOC不要只背“控制反转”而是说“通过反射在容器启动时创建Bean并通过依赖注入维护对象之间的关系从而降低代码耦合”。面试官其实不太喜欢只背结论的候选人。5.3 系统设计简答题别空谈架构商汤笔试里的系统设计题不会太深通常是一道场景题比如“设计一个支持高并发的短网址服务”或“设计一个任务调度系统”。这类题有个通用的答题框架先估算QPS和数据量再设计存储方案再考虑缓存和异步化最后聊可用性和容灾。比如短网址服务我会先定参数假设每天新增100万条短链访问QPS是1000那么存储上至少需要支撑几亿条记录推荐用分库分表或用Redis前置做热点缓存。生成短链时用发号器或哈希截断注意冲突处理跳转时先查缓存缓存缺失再查数据库并异步回写缓存。你只要把这套逻辑讲清楚哪怕方案不够宏大面试官也会认可你的工程思维。6. 运维与测试方向的相关知识6.1 运维方向Linux命令与脚本自动化运维方向的题相对基础但覆盖面广。常用Linux命令必考比如grep、awk、sed处理日志top、vmstat、free查看系统状态netstat/ss查看端口和连接。那场笔试有一道实操题写一个Shell脚本统计日志文件里每个IP的访问次数并按次数倒序输出前10。这道题用awk一行就能搞定awk {print $1} access.log | sort | uniq -c | sort -rn | head -10这里有一个细节sort -rn里的r是倒序n是按数值排序如果漏掉n会出现10排在9前面的问题。这类小问题在真实运维中经常遇到考的就是你是不是真的用过这些命令而不是只看过文档。6.2 测试方向用例设计与自动化测试思维测试方向的笔试一般分两部分测试用例设计和测试工具/自动化基础。比如给你一个登录功能让你设计测试用例很多人会写“输入正确账号密码能登录”但优秀的回答会覆盖等价类、边界值、异常场景和安全性。例如密码长度上限、密码带空格、SQL注入字符、连续失败后的锁定策略、验证码过期等。这些用例不是在背模板而是在模拟真实用户和生产环境的交互。自动化测试会问到Selenium、接口测试工具、持续集成里的测试环节。相关方向还经常问性能测试指标吞吐量、响应时间、错误率、CPU使用率之间的关联。这里我建议准备一个实际的性能测试案例比如用JMeter压一个登录接口观察在并发100和1000用户下TPS的变化曲线然后分析瓶颈点。有具体案例的答案比空谈理论强很多。7. 常见问题与实战经验实录7.1 笔试环境与答题顺序的注意事项线上笔试最大的坑是环境问题。我建议提前一天装好本地IDE并顺手测试输入输出样例。很多编程题不是让你写完整工程而是从标准输入读取数据、向标准输出打印结果格式错一个字符就是0分。我见过太多人本地跑得好好的提交上去因为println多了个空格判错非常可惜。时间分配上我个人的策略是“70%时间做分值高的题20%做基础题10%检查”。先写有把握拿满分的算法题再做选择填空最后回头补不确定的题。不要按照试卷顺序死磕商汤的题目顺序通常是从基础到进阶但分值权重并不均衡死磕第一题往往得不偿失。7.2 不同岗位方向如何针对性地准备根据笔试经验我整理了一份各方向准备重点供参考方向准备重点推荐复习内容C/C指针、内存、编译链接手写strcpy/strlen、字节对齐、C对象模型算法开发数据结构、DP、图论LeetCode Hot 100、剑指Offer、竞赛DP题大数据海量数据、MapReduce、SQL哈希分治、Spark原理、窗口函数数据挖掘特征工程、模型原理、评估指标LR/树模型、缺失值处理、分类评估后端网络、并发、数据库、系统设计TCP/HTTP、线程池、索引、短链设计运维Linux、Shell、监控awk/sed实战、日志分析、性能排查测试用例设计、自动化、性能等价类边界值、JMeter、Selenium这个表格不是给所有人照抄的核心思路是先分析目标岗位的业务特点再回头看笔试里的高频考点。AI算法岗一定重点考数据和模型思维平台岗则更看重工程能力和排查思路。7.3 笔试之后复盘比分数更重要我当年笔试结束后专门花了一个晚上重新做了一遍那些做错的题并把每个错题背后的知识点整理成一份错题本。后来我发现这份错题本对我后续面试帮助巨大因为笔试容易错的地方面试时也最容易被追问。比如strcmp的返回值细节、TCP关闭时的四次挥手、HDFS的小文件问题这些都是一环扣一环的知识点。最后再分享一个小技巧是我不论面哪家公司都坚持的笔试结尾留5分钟检查输入输出格式和可能越界的边界条件。哪怕你算法写得再好提交上去编译失败也是白费。稳是校招笔试里最容易被人低估的决胜因素。