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

资讯详情

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

滴滴智能交互工程师笔试复盘:机器学习与数据结构核心考点解析

滴滴智能交互工程师笔试复盘:机器学习与数据结构核心考点解析 秋招那会儿我等滴滴的笔试通知等了快两周结果打开邮件一看岗位是“智能交互技术研发工程师”。当时心里咯噔一下这个方向比普通的后端或者算法岗要宽不少语音、图像、NLP、机器学习基础、数据结构都有可能会考。做完之后最大的感受是这套题不像在考你会不会调包而是想看你作为一个搞智能交互的人基础扎不扎实、脑子清不清楚。这套笔试分单选、多选和编程题整体风格偏经典难度属于“认真准备过就能过裸考容易挂”的档次。我把整张卷子逐题复盘了一遍里面有几个点特别容易出错也有几道题放在今天看依然值得琢磨。我把完整的解析和踩坑记录写出来给后面准备智能交互、人机交互、多模态算法方向笔试的同学当个参考。1. 试卷整体风格与考查倾向智能交互岗到底在筛什么人我做完这套题之后第一感觉是智能交互技术研发这个岗位的笔试并不是纯粹招算法研究员也不是纯粹招客户端开发它想找到的是两者交叉地带的人。整张试卷的知识点分布大概是这样考查方向对应题目占比考点细分机器学习基础单选第1、3、4题多选第1题约30%TensorFlow架构、贝叶斯分类器、激活函数、逻辑回归数据结构与算法单选第5、6、7、9题约35%哈希表、图遍历、排序稳定性、递归、动态规划计算机视觉基础单选第2题多选第2、3题约20%图像分类任务特性、卷积核、空洞卷积编程与逻辑单选第8、10题全部编程题约15%人工智能概念、方阵移动、字符串、队列、回文这个占比很说明问题。智能交互产品比如语音助手、智能客服、多模态交互界面的研发工程师日常工作中大量涉及数据流转、特征处理和模型推理。你不需要像算法研究员那样徒手推一篇顶会的公式但你需要知道模型输入输出怎么接、数据结构怎么选、边界条件怎么处理。另外这套题有一个隐蔽的“坑点”它单独把搜索热词、逻辑判断、方阵移动方向这类题放在单选里表面上是在考“常识”实际上是在考你的工程建模能力。比如方阵移动那道题本质上就是一个二维坐标变换的状态机问题跟你在图像上做仿射变换、在UI里做手势识别是一模一样的思维。我自己在做的时候最大的感受是笔试不是看你会不会背而是看你在有限时间内能不能把问题抽象成可计算的模型。这一点在编程题里表现得特别明显。2. 单选题逐题解析这些题看似基础实际全是陷阱2.1 Android平台上常用的机器学习框架TensorFlow为什么是对的单选题第一道问的是Android平台上常用的机器学习框架。选项里有TensorFlow、Caffe、Theano、Torch正确答案是TensorFlow。这道题放在今天看几乎等于送分题。2018年那会儿TensorFlow已经发布了Android Lite的预览版也就是后面TFLite的前身Caffe虽然也能跑在移动端但这方面一直不是它的主场Theano在2017年就宣布停止维护了Torch当时的主力还是Lua语言不是Python在Android端的支持约等于零。这道题真正想考的其实是你有没有关注过移动端推理引擎的生态变化。TensorFlow从1.x时代就开始布局移动端Interpreter机制、量化压缩、算子融合这些思路后来也被很多国产推理框架借鉴。如果换到现在做一版答案会变成TensorFlow Lite、PyTorch Mobile、ONNX Runtime Mobile还有飞桨Paddle Lite、腾讯NCNN、阿里MNN这些国产框架。智能交互研发工程师写代码的时候逃不开这个领域因为语音唤醒、手势识别、人脸关键点检测基本都是跑在端侧的。提示遇到这类题目别只看教材上写了什么框架的名字想一想在特定场景下哪个框架最顺。Android/iOS端选TFLite/PyTorch Mobile嵌入式端选NCNN/MNN跨平台部署可以考虑ONNX Runtime。2.2 图像分类任务的细节一张图多个对象怎么就变成分类了第二题问图像分类任务。题干那个表述我至今记得很清楚——它给出的场景是“一张图片中仅包含一个对象判断该对象所属的类别”。答案是这种任务本质上是单标签分类。这道题有一个反向迷惑的地方如果不认真审题很容易联想到目标检测、实例分割、图像caption这些更“高级”的任务。但题干里白纸黑字写了“仅包含一个对象”那核心就是判断类别这才是分类的标准定义。我后来在实际项目中遇到过类似的混淆。做一个智能相册功能PM给的原始需求是“识别照片里有什么”开发同学上来就上了YOLO做目标检测结果很多照片里物体零散、重叠严重检测框一塌糊涂。后来仔细一捋发现产品想要的只是“这张照片是风景/人物/食物”这个颗粒度的分类完全可以用轻量分类网络搞定速度和准确率都更好。所以这道题背后的工程经验是任务定义比模型选择更重要。分类、检测、分割三者的核心区别在于输出空间分类输出一个类别标签假设主体单一检测输出一组边界框类别允许一张图多个目标分割输出像素级掩码需要知道目标的具体轮廓在智能交互场景里绝大多数用户指令都对应着“分类”这种粗粒度理解只有到了抓取、编辑这个层级才需要检测或分割。笔试考这道题本质上是在看你有没有这样的工程判断力。2.3 贝叶斯分类器“最优”的前提真实分布已知第三题问的是“朴素贝叶斯分类器在什么条件下最优”。正确答案是当特征之间相互独立且各个特征重要性相同时朴素贝叶斯分类器是最优分类器。很多同学看到“朴素贝叶斯”就条件反射地写“特征独立时最优”。但这道题真正的考点是后半句还有个前提是各个特征重要性相同。朴素贝叶斯计算后验概率时把每个特征的似然直接相乘这本身就隐含了“各特征对分类结果的贡献一样大”这个假设。写代码的时候这个前提容易被忽略。我之前做一个文本情感分类的Demo接入了两个特征源一个是词频向量一个是评论长度。这两个特征的量纲差了上万倍归一化之后做朴素贝叶斯训练效果反而比只用语料词频差。原因就是“评论长度”这个特征被模型当成了和情感词同等重要的因子实际它几乎不携带情感信息。注意BCEBinary Cross Entropy跟朴素贝叶斯的“独立假设”经常一起出现在面试里。BCE适合二分类输出层它的前提是各输出节点互相独立如果输出节点有依赖关系用softmax或者结构化损失更好。这两个“独立性”坑我都在面试中被问过建议一起复习。关于这个“真实性”的问题还想多说一句。题目里说的“最优”是理论上用真实分布做分类决策时的最优当真实分布未知我们只能用训练数据去估计这时朴素贝叶斯的“最优性”就不成立了。这也是为什么朴素贝叶斯常用于文本分类这种高维稀疏场景——真实分布学不到但独立假设可以带来计算上的巨大简化效果好到令人意外的程度。2.4 斐波那契递归的时间复杂度这道题争议最大第四题问斐波那契数列的递归实现时间复杂度是多少。正确答案是O(2^n)。这道题当年在网上吵了很久。原因是有同学觉得“它每次只递归两个子问题应该是O(n^2)”还有人觉得“随着n增大指数爆炸但不至于2的n次方那么夸张”。实际上你要看递归树计算F(n)需要计算F(n-1)和F(n-2)计算F(n-1)需要计算F(n-2)和F(n-3)每一层都会把计算量翻倍但最底层有重复计算画出递归树就清楚了树的高度是n每一层的节点数按2的指数增长总节点数就是2^(n1)级别。去掉常数项就是O(2^n)。这里有一个笔试中“隐藏的进阶考点”很多公司会接着问你那怎么优化到O(n)答案是记忆化递归自顶向下或者动态规划自底向上把每个子问题的结果保存下来让每个F(k)只计算一次。时间复杂度就变成O(n)了。那个场景很像实际工作中的算法优化思路同样的功能朴素实现是能跑但数据量一大就GPU OOM、CPU飙红、用户等半天。你要做的就是在正确性和效率之间找平衡。斐波那契从O(2^n)优化到O(n)的过程本质上就是把重复计算缓存起来工程里叫memoization换到大模型推理里这种思路经常被用在KV Cache、前缀缓存这些优化上。2.5 哈希表“平均”查找效率的真相不要被极端情况吓到第五题问哈希表的平均查找时间复杂度。正确答案不是O(n)而是O(1)。很多数据结构教材都会强调哈希表在冲突极端严重的情况下查找效率会退化成O(n)这导致不少同学看到“平均”两个字反而犹豫了。哈希表在哈希函数设计合理、装填因子控制在合理范围内的前提下冲突概率很低平均查找长度趋近于常数。这道题的深层次考点是冲突解决策略。常见的策略有链地址法和开放定址法。链地址法把冲突元素挂到链表上开放定址法沿着探测序列找空位。这两种策略的时间复杂度摊还下来都是O(1)但前提是载荷因子不能太高。JDK 1.8的HashMap把链表转红黑树的阈值设为8就是因为在载荷因子0.75的情况下链表长度到8的概率已经极低转成红黑树是为了抵御极端哈希碰撞攻击。我实际写代码时遇到过哈希函数的坑。当时给一个智能问答系统做词表映射直接用字符串的hashCode当key结果出现大量碰撞接口耗时从2ms涨到50ms。后来改了哈希函数用更分散的方式计算特征字符串的哈希值性能立刻恢复。这道题从笔试到工作都有用强烈建议一定要把哈希表的原理吃透。2.6 图的广度优先遍历为什么“准层次遍历”是错的第六题考广度优先遍历BFS。题目问哪个说法正确正确答案是BFS借助队列实现。有个选项是“BFS类似于树的层次遍历”——这个描述本身没错但它不是标准定义出题人在这里玩了一个文字游戏。教材上对图的广度优先遍历和树的层次遍历是有意做区分的树有明确的层次关系不存在环路不需要判重图可以有环BFS时需要借助visited数组防止重复访问。这道题提醒我们复习数据结构时不能只看“概念相似性”要连“实现细节”一起记忆。我用一句话总结BFS和DFS的区别笔试面试都适用BFS队列先进先出通常用来求无权图的最短路径DFS栈递归调用栈或显式栈通常用来做连通性检测、拓扑排序、回溯搜索这里再补充一个智能交互场景里的例子。当时在做多轮对话的状态管理用户每说一句话系统都要在当前可能的对话状态图中搜索“下一步应该进入哪个状态”。这个搜索本质上就是BFS——用户的反馈是一个状态节点候选意图是邻居节点找到最可能的意图的过程就是“在邻居节点中找最匹配的那个”。如果当时DFS用得多了很可能陷入某一条对话分支里出不来。BFS的“逐层扩展”特性恰恰符合多轮对话的状态流转逻辑。2.7 快速排序的不稳定性一个“丢了稳定性”的代价第七题考快速排序是不是稳定排序。正确答案是不是。稳定排序的定义是相等元素的相对顺序在排序前后保持一致。插入排序、冒泡排序、归并排序是稳定的快速排序、堆排序、选择排序、希尔排序是不稳定的。快速排序为什么不稳定核心在partition过程。它通过交换元素把基准值放到中间位置交换过程中如果数组里有两个相等的元素两者相对顺序很可能被打破。举个例子数组[3a, 3b, 2]选第一个3a做基准partition完之后变成[2, 3b, 3a]。原来的两个3的顺序是a在前、b在后排序后变成b在前、a在后稳定性被破坏了。工程上的实际影响是如果你的排序对象是一个对象数组而且你需要按多个字段依次排序先按时间排时间相同按优先级排不稳定排序会导致前一轮的排序结果被后一轮打乱。解决方法是要么用稳定的归并排序要么给每个元素加一个序号字段作为排序的次要键。在做智能交互系统的推荐排序时我经常需要“先按相关性得分排序再按点击率排序”这种情况下我从来不会直接对Object数组做两次快速排序而是构造一个带原始索引的排序Key。这也是为什么很多搜索引擎的倒排索引合并且时会优先选稳定排序来实现多级排序。2.8 人工智能概念与“图灵测试”的坑第八题考人工智能的基本概念跟图灵测试相关。当时选项里有一个“人工智能就是深度学习”的表述明显是错的。但可惜不少同学看到“智能交互”岗位就条件反射认为这题应该跟深度学习挂钩选了它。这道题真正的核心是人工智能、机器学习、深度学习三者是包含关系不是相等关系。人工智能是大范畴机器学习是AI的一个子集深度学习又是机器学习的一个子集。其实图灵测试也在这个选项里出现过。图灵测试是判断机器能否“思考”的经典方法但它并不等于人工智能本身它只是一个检验标准。智能交互领域很多评价指标也有类似的特点比如图灵测试讨论的是“能否以假乱真”但工业界的对话系统评价更看重“任务完成率”“用户满意度”“多轮成功率”。笔试里出现概念题其实是在提醒你区分“定义”和“评价”。2.9 哈希表重复考点的二次确认这次考的是“最坏情况”除第5题之外单选题里还有一道跟哈希表相关的题这次考察的是最坏情况下哈希表查找的时间复杂度。正确答案是O(n)。为什么最坏情况是O(n)考虑一个极端场景所有数据经过哈希函数计算后都落到同一个桶里。如果这个桶用链表存储链表长度就是n查找复杂度自然退化成O(n)。这两道哈希题其实在考同一个知识体系哈希表的平均性能是O(1)但最坏性能是O(n)我们要做的是让“最坏情况”不发生。如何避免就是设计均匀的哈希函数、控制载荷因子、当冲突严重时及时扩容或转换冲突数据结构。在智能交互的实际业务里也遇到类似的问题。当时做一个敏感词过滤服务把几十万个敏感词全部哈希到一个集合里做快速匹配。前期选了一个很简单的哈希函数结果某些类别的词大量碰撞服务高峰期CPU打满。后来换成了更均匀的哈希函数并且把集合分片性能才稳定下来。读到这里你可能会发现第5题和第9题本质上就是同一个知识点从两个角度考——一个是“平均”一个“最坏”。这提醒我复习时一定要对一个知识点做“两极思考”最好情况什么表现最坏情况什么表现触发条件是什么。2.10 逻辑推理题方阵移动方向判断第十题是一道逻辑推理/空间思维题某种方阵按照特定规则移动问最终移动方向或位置。这类题没有固定的算法模板核心是把规则抽象成坐标变换。我当时做题的思路是先把方阵的初始位置用坐标表示然后按规则逐帧推导不要试图在脑子里转来转去。这类题的工程启示有点意思——做智能交互里常见的“手势轨迹识别”时本质上也是把一系列触摸点映射成方向向量序列然后通过状态机判断用户意图是滑动、旋转还是缩放。遇到这种题建议在草稿纸上把坐标变换写出来而不是靠“直觉”。因为人在三维空间里的直觉往往不可靠但在二维平面上的坐标推导则几乎不会出错。下面我会在编程题的解析里提供一个实际的坐标变换案例思路是完全一致的。3. 多选题逐题解析多选才是拉开差距的关键3.1 逻辑回归为什么它是“线性分类器”而不是“回归器”多选第一题考逻辑回归。题干问的是关于逻辑回归说法正确的是哪些。我需要重点讲一下“逻辑回归为什么名字里有回归但实际是分类器”这个点。逻辑回归在线性回归的基础上加了一个Sigmoid函数把线性输出映射到(0,1)之间作为概率输出。所以它本质上是广义线性模型用于分类任务特别是二分类。逻辑回归的决策边界是一条线或一个超平面它属于线性模型。深度学习中常见的一个误用是把逻辑回归当成神经网络里的“黑盒”来用。其实逻辑回归就是单层神经网络加Sigmoid理解了逻辑回归你就理解了神经网络最基础的单元。多选里另一个易错选项是关于逻辑回归的损失函数。逻辑回归用的是交叉熵损失对数似然损失不是均方误差。为什么不用均方误差因为Sigmoid把输出压到了0到1之间均方误差在这个区间是非凸的容易陷入局部最优而交叉熵对应的是极大似然估计整个优化曲面是凸的用梯度下降可以稳定找到全局最优。注意逻辑回归不是回归模型是分类模型。工程上做点击率预估、风险评分、意图二分类都常用逻辑回归。它的优势是可解释性强在线学习更新方便在智能交互的意图识别模块中逻辑回归至今仍然扮演着一个非常重要的baseline角色。不要因为它简单就轻视它。3.2 卷积神经网络的基础常识卷积核到底做了什么多选第二题考卷积神经网络CNN选项涉及卷积核的作用、池化层、全连接层等。我当时的答案把以下两个都选了卷积核可以对输入进行特征提取池化层可以减少参数数量、防止过拟合很多人只记住了“卷积核提取特征”这个结论却不知道想明白“为什么卷积核能提取特征”。其实卷积核是一个小的权重矩阵它在输入上滑动并与局部区域做点积运算。不同的卷积核权重会对不同模式产生不同的响应某一组权重可能对边缘敏感另一组权重可能对纹理敏感。多个卷积核叠加就能提取出越来越抽象的特征。池化层的本质是对特征图进行下采样。它有两个作用一是降低特征图尺寸减少计算量二是增强平移不变性。最大池化取局部区域的最大值即使目标在局部区域内有小范围移动池化结果也保持不变。在智能交互场景里CNN做图像分类、手势识别、表情识别都很常见。而且2018年那会儿正是MobileNet、ShuffleNet这些轻量CNN在移动端大放异彩的时候笔试考CNN基础实际上是筛选有没有移动端视觉落地经验的人。3.3 常见算法的多选题哪些算法在“智能交互”里最常见这一道多选题的选项涉及常见的机器学习算法和深度学习方法。按我的记忆正确的选项应该包含TensorFlow/Caffe等框架、SVM、CNN等。其实这道题没有太多高深的点它考的是你对行业技术栈的熟悉程度。在2018年TensorFlow和Caffe是学术和工业界主流深度学习框架SVM是经典机器学习的代表CNN是视觉任务的主力网络。这几个选项放在一起就是想确认你是否真正接触过这些工具和算法。这里分享一个我在面试中常用的答题逻辑当一道多选题里出现“框架类”选项和“算法类”选项混在一起时只要它们都是智能交互会用到的主流技术栈一般都可以选。真正的干扰项往往是那些“逻辑上正确但技术上不太主流”的东西。比如Caffe虽然在移动端不如TensorFlow方便但它在学术研究和工程部署中依然是有效选项所以不能排除。做题技巧多选题的每个选项都单独判断不要因为“这个选项用的框架不新”就不选。题目问的是“常见算法”而不是“最先进算法”主流即可选。3.4 激活函数的对比Sigmoid和ReLU的选型逻辑多选第四题是激活函数相关问Sigmoid和ReLU等激活函数的性质。我印象比较深的是“Sigmoid的输出范围是0到1之间”和“ReLU在输入大于0时导数为1”这两个选项都正确。激活函数在神经网络里相当于一个“非线性开关”。如果没有激活函数神经网络无论有多少层都等价于一个线性变换表达能力会被极大限制。Sigmoid函数将任意实数映射到0到1之间适合作为二分类输出层的概率输出。但它有两个问题一是容易饱和输入过大或过小时梯度接近0导致梯度消失二是输出不是零中心的会拖慢收敛速度。ReLU函数在输入为正数时输出等于输入导数为1解决了正区间的梯度消失问题在输入为负数时输出为0使网络具备稀疏性。它在深度学习中被广泛使用但“负区间全为0”也会导致某些神经元永久死亡因此后续又出了LeakyReLU、PReLU等变体。在智能交互的实际任务里选择激活函数的经验是二分类输出层用Sigmoid多分类输出层用Softmax隐藏层优先ReLU及其变体比如LeakyReLU、ELU、Swish回归任务输出层一般不用激活函数或用线性激活4. 编程题逐题实战三题覆盖三个核心编码能力4.1 宝石合成问题题目描述原型大概是这样有若干种宝石每种宝石有不同数量给出了任意两个宝石合成第三个宝石的配方问最终能否合成出目标宝石最多能合成几颗。解题思路这道题完全就是队列/拓扑排序的套壳。把合成配方看作一个有向图两个原料节点连到产品节点。如果当前拥有的宝石集合里包含配方所需原料那么这个配方就可以被触发产生一个新宝石然后继续尝试其他配方。我的核心做法是初始化一个可用宝石的多重集合计数维护一个队列存放“本次新增的宝石”每次从队列取出一个宝石检查所有以它为原料之一的配方是否已经满足如果某个配方所需原料全部满足就扣掉原料、生成产物、把产物入队同时记录产物数量这本质上就是BFS式的“原料触达”过程。C参考实现#include bits/stdc.h using namespace std; struct Recipe { int a, b, c; // a b - c }; int main() { int n, m, k; cin n; vectorint cnt(n 1, 0); for (int i 1; i n; i) cin cnt[i]; cin m; vectorRecipe recipes(m); vectorvectorint rely(n 1); vectorint need(m, 2); // 记录每个配方还需要几份原料 queueint q; for (int i 0; i m; i) { cin recipes[i].a recipes[i].b recipes[i].c; rely[recipes[i].a].push_back(i); rely[recipes[i].b].push_back(i); // 若一开始就满足则直接入队待处理 } cin k; for (int i 1; i n; i) { if (cnt[i] 0) q.push(i); } int ans 0; while (!q.empty()) { int x q.front(); q.pop(); // 宝石x可能通过多种途径新增所以处理两次 for (int id : rely[x]) { if (need[id] 0) continue; need[id]--; if (need[id] 0) { int c recipes[id].c; int require_times min(cnt[recipes[id].a], cnt[recipes[id].b]); // 实际上走到这里说明两个原料都有了消耗一份 cnt[recipes[id].a]--; cnt[recipes[id].b]--; cnt[c]; ans; q.push(c); } } } cout cnt[k] endl; return 0; }这个代码逻辑在线。需要提醒的是这里用need数组记录每个配方还差几个原料但更稳妥的做法是直接检查配方两个原料的当前数量。我在笔试现场用的就是后者——每次有新宝石产生就遍历所有配方检查原料是否齐全。那样的复杂度是O(新增次数×配方数)数据量小没毛病但数据量大了会慢。实际工程里这种“事件驱动”型写法很常见。比如在工单系统里某个资源的变动会触发一系列下游任务在智能交互里一个语义槽位被填满也会触发后续的API调用。这套“队列计数依赖触发”的模式值得好好练。4.2 日历问题题目描述原型给定一个年份和这一年的第几天输出对应的日期即“年-月-日”格式。解题思路这道题考的是日期计算基本功属于“不涉及高级算法但必须把边界条件写对”的题。核心是闰年判断和月份天数表。闰年判断规则能被4整除但不能被100整除是闰年能被400整除也是闰年每月的天数用数组存好2月在闰年时是29天平年28天。然后从1月开始逐月扣除天数剩下的就是当前月的日期。Python参考实现def leap_year(y): return (y % 4 0 and y % 100 ! 0) or (y % 400 0) def day_of_year(y, d): month_days [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] if leap_year(y): month_days[1] 29 for month, days in enumerate(month_days, start1): if d days: d - days else: return f{y}-{month:02d}-{d:02d} y int(input().strip()) d int(input().strip()) print(day_of_year(y, d))这个写法里有一个常见坑循环里判断d days等于天数时直接返回绝不能在等于天数时还继续减。我见过很多同学在d days时把当月天数减掉结果变成下个月的0号直接报错或输出错误日期。日期题在地图、出行、智能助手场景里真的很常见。比如出行App里预测“从A到B的最早到达时间”日历组件里计算某一天是周几、某个节假日落在哪一天都逃不开日期逻辑。这道题虽然简单但写错的代价很大——在智能交互里一个日期解析错误会导致整个任务失败用户的信任度直接下降。4.3 回文字符串题目描述原型给定一个字符串判断能否通过重新排列变成一个回文串大概是这个意思。解题思路回文串的核心性质是最多只有一个字符出现奇数次其他字符都必须出现偶数次。解释一下如果字符串长度为偶数所有字符出现次数必须都是偶数如果字符串长度为奇数恰好有一个字符出现奇数次其余都是偶数次这道题如果先写“判断一个字符串是否是回文”的双指针解法方向就错了。题目说的是“重新排列后能否构成回文”实际考的是字符频次统计。Python参考实现from collections import Counter s input().strip() cnt Counter(s) odd_count sum(1 for c in cnt.values() if c % 2 1) if odd_count 1: print(YES) else: print(NO)这个简短的代码背后藏着很多智能交互场景的影子。比如语音助手的“文本纠错”功能用户说“回文”系统需要判断一段文本是否能通过重排变成回文才能决定纠错策略再比如聊天机器人处理用户输入时经常需要对输入文本做归一化或排列判断。这种统计字符频率、判断奇偶性的题属于编码基本功中的基本功。这道题其实还可以延伸出更难的版本给定一个字符串返回它可以构造出的所有回文排列。那个版本需要用回溯对称构造法。如果笔试时间充裕可以往这个方向多想一步但先把基础版本做对更重要。5. 复盘总结从这套题能看出智能交互岗的什么门道整套笔试做下来我的体会是“智能交互技术研发工程师”这个岗位对候选人的要求集中在三块机器学习基础特别是分类模型数据结构特别是哈希、队列、图遍历编程能力特别是边界条件的处理。不要以为智能交互岗只考机器学习或深度学习恰恰相反数据结构和基础算法占了很大比重。原因不难理解智能交互系统的背后是大量的状态管理、数据流转、特征匹配和逻辑判断。一个连哈希表平均复杂度都讲不清楚的人很难在线上场景里做好特征缓存和索引优化。一个连BFS和DFS都分不清的人很难去实现多轮对话的状态搜索。单选题里反复考察的贝叶斯、逻辑回归、CNN、激活函数也说明这个岗位要求你具备扎实的模型基础。这些模型看起来“老”但它们是理解更复杂模型的地基。Transformer里的QKV注意力本质上也是在计算某种加权概率分布多模态交互里的图文匹配本质上也可以看成某种贝叶斯后验推理。编程题更不用说宝石合成的“队列BFS触发”、日历问题的“日期边界条件”、回文串判断的“频次统计”三题各考一种编程基本功。这套题放在今天依然是智能交互方向笔试的高质量参考。如果你现在正在准备类似岗位我的建议是数据结构不能丢哈希表、栈、队列、图遍历必须能默写出核心代码机器学习概念要重视贝叶斯、逻辑回归、激活函数这些基础往往比“会调Transformer”更常考多写边界条件日期题、回文题、合成题出错几乎都出在边界不是核心逻辑学一点移动端推理知识TensorFlow Lite、NCNN这些轻量推理引擎在智能交互岗笔试面试里出现的频率越来越高我后来跟几个进了滴滴的同学聊大家一致认为这套笔试题的出题质量很高没有偏题怪题全是研发日常真正会用到的东西。准备这类笔试与其去刷那些“大全套”的题库不如把机器学习基础、数据结构、编码基本功这三板斧打磨扎实。做题的时候多想一步“这个知识点我以后会在哪里用到”往往会有完全不一样的收获。
返回列表