前几天整理邮箱里的旧面经,翻到自己当年参加网易实习生招聘人机交互算法岗位笔试的记录,一时间很多细节又涌上来。那场笔试恰好赶上2018年春季那批,题目量不小,覆盖范围也杂,既有传统的算法数据结构题,也有不少跟交互场景绑定的分析题。这两天不少学弟学妹来问人机交互算法实习生到底考什么、该怎么准备,干脆把那次笔试的内容和复盘思路完整写出来,给准备投这个方向的同学一个可参考的坐标。
先说明一下,这篇内容适合三类人看:一是准备投网易或其他大厂人机交互算法方向实习的在校同学,二是对“算法工程师在现场到底怎么做交互优化”感到好奇的开发者,三是想了解面试官如何在笔试环节筛选候选人的求职者。我会尽量把题目背后的考察逻辑讲透,而不只是贴答案,因为那场笔试给我的最大启发是:面试官想看到的不是你会背多少算法,而是你能不能把算法放到真实的人机交互问题里去解决问题。
1. 岗位定位与考点全貌:人机交互算法实习生到底在考什么
1.1 先从岗位名称拆解考察意图
“人机交互算法实习生”这个title一眼看过去很容易让人懵,因为“人机交互”和“算法”听起来像是两个方向。但网易的这类岗位定位其实很清晰:用算法手段去理解和优化用户与产品之间的交互过程。它既不是纯学术意义上研究新型交互技术的实验室岗位,也不是纯粹做推荐系统或广告排序的传统算法岗,而是处在两者之间的交叉地带。
从笔试的题目构成能反推岗位的三个核心能力要求。第一个是底层算法基本功,这决定了你能不能把数据处理干净,能不能在资源受限的情况下跑通模型。第二个是机器学习与数据建模能力,因为交互优化的本质是从用户行为数据里找到规律,比如点击、滑动、播放、停留时长这些信号背后藏着什么意图。第三个是交互设计与产品sense,说白了就是你能否把一个算法输出转化成对用户有意义的改变,比如界面布局调整、内容推荐策略变化、反馈机制优化。
2018年那份笔试卷子一共分了四大部分:选择题、算法编程题、机器学习简答题、交互场景分析题。每个部分的权重不完全一样,但从现场感受来看,算法编程题和交互场景分析题是最能拉开差距的,因为选择题大家都能蒙不少,真正决定是否进入面试的是后面两类题目。
1.2 试卷结构还原与热点方向预判
我尝试把那次笔试的题型分布还原出来,好让后来者有直观认知。整体时间150分钟,题量相比其他大厂属于中等偏少的水平,但每道题都需要深入思考。
| 题型分类 | 题量 | 覆盖内容 | 建议时间分配 |
|---|---|---|---|
| 基础选择题 | 12题 | 数据结构、概率统计、操作系统、网络基础 | 30分钟 |
| 算法编程题 | 3题 | 字符串处理、排序变种、搜索与动态规划 | 60分钟 |
| 机器学习简答 | 2题 | 特征工程、模型评估、常见算法原理 | 30分钟 |
| 交互场景分析 | 2题 | 产品可用性诊断、交互方案设计 | 30分钟 |
这里要提醒一下,每年的题目结构和考点会有波动,但这张表传递的核心信号一直没变:算法基本功占大头,机器学习能力被单独考察,交互设计思维是区分度最高的加分项。
再结合2018年前后的行业趋势看,那个时间节点刚好是推荐算法在音乐、资讯、视频类产品里全面普及的阶段,网易云音乐的个性化推荐、歌单智能生成、评论区情感分析都做得非常深入,所以笔试里出现大量与内容推荐、用户行为序列相关的题目并不意外。如果你现在准备类似的笔试,多关注多模态理解、LLM在交互场景的应用、用户长短期兴趣建模这些方向会有更好的命中率。
2. 算法编程题深度拆解:从真题看考察逻辑与解题思路
2.1 字符串与模式匹配:KMP算法的新瓶旧酒
那年第一道编程题表面披着“字符串匹配”的外衣,实际上考的是对经典算法的理解和变通能力。题目大意是:给定一个模式串P,要求在文本串T中找到所有匹配的起始位置,并且要求支持在匹配过程中跳过某些位置(具体细节记不太清了,但核心是对KMP算法的状态转移做改造)。
KMP算法在“网易云音乐歌词实时高亮”或者“搜索关键词纠错”这类交互场景里有天然的应用,所以出现在人机交互方向也不算突兀。KMP的核心思想是利用next数组保存模式串内部的最长公共前后缀长度,这样匹配失败时主串指针不必回溯,模式串指针跳到next指定的位置继续比较。
对于模式串 ( p = "abacaba" ),next数组的计算过程是这样的:
下标 i: 0 1 2 3 4 5 6 模式串: a b a c a b a next[i]: -1 0 0 1 0 1 2next[i] 定义为模式串前i个字符组成的子串中,最长相同前后缀的长度减一(部分教材实现不同,有的是直接存长度,笔试时建议先明确约定)。以 i=3 时为例,子串是 "aba",前缀集合 {a, ab},后缀集合 {a, ba},最长公共前后缀为 "a",长度为1,所以 next[3] = 0(按减一约定)。
那年的题目如果把next数组从“固定长度”改成“动态权重”,比如每个字符有一个权值,最长公共前后缀的要求从“相等”变成“加权相似度最高”,就需要用扩展KMP或者Z算法配合DP来处理。我当时在考场上选择先写标准的KMP框架,再把权重判断嵌入到next的生成逻辑里,虽然时间复杂度没有做到最优,但至少保证了解法的完整性和正确性。
个人建议:面对这类熟悉算法的变种题,第一优先级是写出可运行、逻辑自洽的版本,不要一上来就追求最优解。面试官看的是你能否快速定位问题本质并用已有工具解决,而不是比拼竞赛选手的奇技淫巧。
2.2 排序算法的交互场景变种:从冒泡到堆排的思维跃迁
第二道编程题考了排序,但加了一个交互场景的包装。大致意思是:网易云音乐的“我喜欢的音乐”列表允许用户手动拖拽调整歌曲顺序,现在需要设计一个排序算法,使得在用户很少手动调整的前提下,新的推荐排序与用户手动排序之间的“差异度”最小。
这个“差异度”的度量方式题目给了定义——可以理解为两个序列之间的逆序对数量或者编辑距离。我当时第一反应是这题本质就是在计算“两个排列之间的相似度”,最直接的做法是用归并排序统计逆序对,复杂度O(n log n),同时也能顺手完成排序。
但这里藏着一个坑:如果直接把推荐列表排序成和用户手动列表完全一致,那就失去了“推荐”的意义。题目真正的考察点是如何在“尊重用户既有操作”和“保持推荐多样性”之间找到平衡,对应的解法是引入一个“锚定系数”,对已经手动调整过的歌曲给更高的权重,未调整的歌曲保持推荐算法给出的原始相对顺序。
写代码时我用了一个结构体存储歌曲id、推荐分、手动调整次数三个字段,排序规则是先按手动调整次数降序,再按推荐分降序。这样手动调整越多的歌曲在最终序列中越靠前,其他人还按推荐分的相对顺序走。
这道题给我的启发是,大厂的算法笔试题哪怕考的是基础排序,也会想办法包装成一个产品层面有真实意义的问题。如果你只是会闷头写快排、归并、堆排的模板代码,而不理解每种排序的稳定性和额外空间开销在什么业务场景下重要,很容易在面试官追问“为什么选这个排序而不是那个”的时候卡壳。
2.3 贪心与粒子群:当经典启发式算法撞上交互优化
第三道编程题让我印象最深刻,因为它把粒子群算法(Particle Swarm Optimization)直接搬到了笔试里。题目场景是:网易云音乐早年间有一个“私人FM”功能,需要在每个时间窗口内从大量候选歌曲中挑选一组歌曲,使得整体的用户满意度最高,同时满足风格多样性、歌手分散度、播放时长预算等多个约束条件。
标准解法有两种路径。一是把它建模成多约束背包问题,用动态规划或贪心策略求解;二是使用启发式搜索算法,比如粒子群算法。题目明确提示可以使用启发式算法,并考察对粒子群算法原理的理解和实现能力。
粒子群算法的核心思想其实用生活类比很好讲清楚:想象一群鸟在觅食,每只鸟都不知道食物在哪里,但知道当前位置离食物有多远,于是鸟群通过共享“个体历史最优位置”和“全局历史最优位置”来不断调整自己的飞行方向和速度。对应到算法里:
- 每个粒子代表一个候选解(一组歌曲选择方案)
- 粒子的位置向量就是歌曲选择的编码
- 粒子的速度向量决定了解空间搜索的方向和步长
- 适应度函数衡量当前解的质量,比如综合满意度得分
- 每次迭代更新速度 ( v = wv + c1r1*(pbest-x) + c2r2(gbest-x) ),再更新位置 ( x = x + v )
我在考场上选择了自己更熟悉的贪心策略作为保底方案,然后在此基础上实现了粒子群的框架。贪心策略是按“满意度/播放时长”的比值降序排列,依次选择歌曲直到时间预算用尽;粒子群算法则在这个初始解的基础上做邻域搜索优化。
考后复盘,这道题想考察的其实是候选人对**“传统精确算法算不动时,如何用启发式算法快速逼近可行解”**这个工程问题的认知。交互场景中的优化问题往往约束复杂、状态空间巨大,精确解需要的计算时间用户根本等不起,这时候启发式算法就是最务实的方案。
2.4 附:笔试常考的算法清单与权重评估
为了方便后面准备的同学,我按自己和周围同学的回忆整理了一份人机交互算法方向笔试高频考点清单,按出现频率和重要度排列:
| 算法/知识点 | 出现频率 | 人机交互结合点 | 准备优先级 |
|---|---|---|---|
| 排序算法(快排、归并、堆排) | 极高 | 列表排序、推荐排序融合 | 必修 |
| KMP/字符串匹配 | 高 | 搜索词匹配、歌词高亮 | 必修 |
| 贪心算法 | 高 | 资源分配、播放列表生成 | 必修 |
| 动态规划 | 高 | 序列建模、用户行为路径规划 | 必修 |
| 图算法(最短路径、二分图匹配) | 中 | 社交关系推荐、内容分发 | 重点准备 |
| 粒子群/模拟退火等启发式算法 | 低-中 | 多约束推荐优化 | 了解原理即可 |
| 聚类算法 | 中 | 用户分群、内容聚类 | 重点准备 |
| 快速幂 | 低 | 配合概率计算题出现 | 熟悉模板即可 |
注意,这份清单不是让你把每个算法都刷到竞赛金牌水平,而是要在理解原理的基础上,能快速判断“什么场景该用什么算法”,并能写出逻辑清晰的代码。面试官最忌讳的就是候选人背了一堆模板,但问一句“为什么这个场景用堆排序比快排好”就答不上来。
3. 机器学习与人机交互的交叉考点:从推荐算法到用户行为建模
3.1 特征工程与行为序列建模:从网易云音乐的真实场景切入
机器学习简答题第一道考的是特征工程,题目给了一个关于用户听歌行为的数据表,包含用户id、歌曲id、播放时长、是否点击红心(喜欢)、是否评论、播放时间戳等字段,要求设计用户对歌曲的偏好特征,并说明为什么。
这道题典型的答法应该从三个层面展开。第一个层面是基础统计特征:用户对某首歌的播放次数、累计播放时长、最近一次播放距离现在的时间间隔。第二个层面是比率特征:播放时长/歌曲总长度的比值,比值高说明用户大概率完整听完了这首歌,是强偏好信号;红心点击率、评论互动率也是类似逻辑。第三个层面是序列特征:用户最近N次播放中该歌曲的出现位置,以及该歌曲前后衔接的歌曲风格分布,这种特征可以捕捉用户的“听觉惯性”。
这里我特别想强调一点,面试官并不想看你说出“播放时长是一个重要特征”就结束,他们要看到的是你对特征背后用户心理机制的解读能力。比如为什么“播放时长/歌曲总长度”比单纯的“播放时长”更有区分度?因为一首3分钟的歌和一首10分钟的歌,用户都是完整播放的话,后者消耗的时间更多,但前者的“完整率”却可能更高,信号强度反而更强。这就是把算法知识和人机交互中的用户体验直觉结合起来思考的方式。
3.2 聚类算法在用户分群中的应用:从向量到画像
第二道机器学习题考了用户分群,要求基于用户的历史行为数据把用户聚成几类,并说明每类用户的核心特征和对应的产品运营策略。这道题其实给了不少自由度,关键看你能不能把K-Means聚类的流程说透,以及能不能从聚类结果中解读出业务含义。
K-Means的流程是:随机选择K个初始簇中心,计算每个样本到每个簇中心的距离,把它归入最近的簇,然后重新计算每个簇的质心,重复迭代直到质心不再变化或达到预设轮数。这里的“距离”怎么定义是个大学问,因为用户行为的原始特征是离散的、高维的、稀疏的,直接算欧氏距离效果很差,通常需要先把特征做降维或Embedding化。
我在回答里用了一个“用户-歌曲类型偏好矩阵”的方案:把用户对曲风的偏好权重做成向量,比如电子、民谣、摇滚、流行、古典各一维,然后用余弦相似度衡量用户间的距离,再进行聚类运算。这样做的好处是向量有明确的语义含义,聚类结果的解读成本低。
产品策略部分我分别举了例子:“夜深人静型”用户(午夜到凌晨活跃)适合推荐轻音乐和助眠内容,“晨间活力型”用户(早上7到9点活跃)适合推荐快节奏、提神的歌单,“通勤路上型”用户(早晚高峰活跃)适合推荐播客和碎片化内容。这种从数据到策略的推导过程,正是人机交互算法岗区别于纯算法岗的核心竞争力。
3.3 强化学习与深度学习算法在交互优化中的实际落点
那年的笔试没有直接出强化学习的大题,但选择题里有一两道涉及深度学习和强化学习基础概念的题目。结合最近几年的行业趋势,我觉得准备这个方向的同学很有必要把这两块内容补充进去。
强化学习在交互产品里最常见的应用场景是“动态推荐策略优化”。传统的推荐算法是给用户一批候选内容,算好分数一次性返回;但用户真实感受是在多轮交互中逐步形成的,可能这轮推的歌用户不喜欢,但下一轮通过调整策略又挽回了。强化学习里的“状态-动作-奖励”框架恰好能描述这个过程:状态是用户当前的行为序列和历史画像,动作是本次推荐的内容组合,奖励是用户是否点击、播放、收藏、分享。
深度学习模型在人机交互领域的价值更多体现在对非结构化数据的理解上。比如交互式语音助手需要把语音转文字,再看意图、抽槽位;视觉交互界面需要目标检测和OCR识别按钮位置;内容社区需要理解用户评论的情感倾向。这些能力在算法笔试中不一定直接考代码,但很可能会以简答题或场景设计题的形式出现。
我自己的一个体会是,这个交叉岗位招的人未必是深度学习算法领域最强的研究者,但一定是对算法能落地到什么产品场景有清晰认知的人。所以复习的时候可以多看一些网易云音乐、网易严选、网易新闻这些产品里算法发挥作用的案例,比埋头刷题更有用。
4. 在线笔试实操过程复盘:从读题到提交的完整思维链
4.1 时间分配策略与做题顺序的设计思路
在线笔试和线下笔试最大的区别是:你在自己熟悉的电脑前,可以自由使用IDE、搜索引擎、甚至本地代码片段。但这既是优势也是陷阱,因为大厂的在线笔试系统通常有切屏检测,频繁切换窗口会被警告甚至取消成绩。建议考前把本地环境准备好:电脑充满电、网络稳定、随手能打开常用代码模板库。
做题顺序我建议“先做快速拿分题,再做需要深度思考的题”。具体来说,先花10到15分钟把选择题扫一遍,把有把握的题立刻作答,不确定的题标记下来留到后面再回来想。然后做机器学习简答题,因为这类题不需要代码运行,你的思路只要足够清晰就能拿大部分分数。接着做交互场景分析题,这类题考察的是设计思维,没有绝对的标准答案,开放度很高,认真写就能拿分。最后集中精力攻克算法编程题。
4.2 一道交互场景题的完整解题演示
很多人对“交互场景分析题”没有概念,觉得不是CS专业出身可能答不好,但实际上这类题恰恰是门槛最低、最容易通过训练提升的。我举个例子,还原当时的一道题:
网易云音乐的桌面客户端在播放音乐时,若用户同时打开了多个窗口(比如播放列表窗口、歌词窗口、评论区窗口),经常出现窗口大小不一、重叠后难以点击关闭的情况。请从人机交互角度分析该问题的成因,并设计一个合理的解决方案。
这道题考的不是算法,而是对用户行为、界面设计原则、状态管理机制的综合理解。我当时从三个层面作答:
第一层是问题成因分析。窗口大小不一导致重叠的根本原因在于,系统对窗口的层级关系(z-order)、默认尺寸、最小化策略缺乏统一的约束。不同窗口由不同功能模块生成,各自的初始尺寸直接写死在代码里,没有根据当前屏幕分辨率和用户历史使用习惯做自适应。重叠后难以点击关闭,则涉及鼠标事件命中的判断逻辑——上层窗口的透明区域默认拦截了鼠标事件,导致下层窗口无法感知点击。
第二层是界面层的解决方案。可以做“窗口自适应布局”和“一个主操作区”的模式,把歌词、评论等辅助功能以侧边栏或浮层形式整合到主界面内,从源头避免多窗口重叠。如果业务上确实需要多个独立窗口,则引入“窗口管理器”,统一记录每个窗口的位置和尺寸,在窗口启动时根据屏幕剩余空间自动调整大小和位置,并把新窗口默认置为不可遮挡主窗口的层叠模式。
第三层是技术实现层面的方案。可以引入一个全局的窗口状态管理器,监听窗口的创建、销毁、移动、缩放事件,维护一张窗口矩形列表;每次有新窗口创建时,运行一个简单的贪心算法寻找当前屏幕上最大的空白矩形区域,把新窗口放到该区域;如果用户手动调整了窗口位置,管理器记录这一偏好并在下次为该用户打开同类型窗口时采用偏好数据。这类算法实现简单、效果立竿见影,不需要复杂的机器学习模型。
这道题告诉我一个非常重要的信息:人机交互算法实习生的笔试里出现的“算法”,不只是代码题里的那头,还可能藏在产品问题设计的方案里。你给方案的时候,如果能自然带上算法设计和数据驱动的思路,会明显比其他候选人高一个段位。
4.3 编程题从读懂到提交的实操步骤拆解
在线编程题的实操环境通常是牛客网或赛码网,编辑器功能比较简单,没有断点调试能力,建议考前熟悉一下这类平台。我们以一道典型的在线编程题“计算两个歌单的相似度”为例,演示完整的解题步骤。
第一步是整理输入输出格式。题目会明确给定输入数据的组织方式,常见的是第一行给一个整数N表示歌曲数量,接着N行每行包含歌曲id和两个歌单中的序号。这种题必须先手推一遍样例,确认数据是按什么顺序读取的。
第二步是设计数据结构。比较两个序列的相似度有很多种计算方式,最常见的是计算两个序列之间的“公共子序列长度占较长的比例”,本质是LCS(最长公共子序列)问题。LCS的经典动态规划转移方程为:
设 ( dp[i][j] ) 表示第一个序列前i个元素和第二个序列前j个元素的LCS长度,则: [ dp[i][j] = \begin{cases} dp[i-1][j-1] + 1 & \text{if } a[i] == b[j] \ \max(dp[i-1][j], dp[i][j-1]) & \text{otherwise} \end{cases} ]
第三步是处理边界条件和内存优化。如果N的范围在1000以内,直接开二维数组没有问题;但如果N到了10000,二维数组的O(N^2)空间就不可接受了,需要优化成滚动数组,只用两行来滚动更新dp值。
第四步是本地自测。写完代码后在本地IDE用几个小规模的样例测试,重点测边界情况:两个序列完全一样、完全不一样、一个序列为空。确认无误后再粘贴到在线平台提交。
第五步是分析复杂度和说明思路。这是很多考生容易忽略的,但部分在线笔试系统要求提交“解题思路说明”,即使不强制,在代码注释里写清楚也能体现专业度。
5. 常见问题与避坑经验:过来人踩过的坑帮你提前填平
5.1 笔试中反复出现的陷阱与应对策略
备考过程中最容易踩的坑有这么几个,我按踩坑频率排个序:
第一坑:轻视选择题里的基础细节。很多同学觉得选择题占分少,瞎蒙也有概率,不用花太多精力。但实际上选择题是拉分的稳定盘,而且大厂笔试选择题的范围非常广,操作系统、计算机网络、数据库、概率论都可能来一道。我当时就在一道“TCP三次握手过程中,第二次握手失败会发生什么”的选择题上纠结了很久,最后答案还没选对。这类题纯靠平时积累,考前突击效率很低,建议长期持续复习。
第二坑:编程题只看逻辑不看边界。在IDE里跑通不等于在平台上通过,因为平台的测试用例会包含大量极端边界:空数组、只有一个元素、元素全部相同、超大输入。我在一次模拟笔试里写过一道归并排序求逆序对的题,逻辑完全正确,但忘记把统计变量声明为long long,导致大数溢出,报错了好几次。这种错误在真实笔试中出现会非常影响心态。
第三坑:把交互场景题当成产品经理笔试题来写。人机交互算法岗场景题的重点不是“设计一个好看好用的功能”,而是“用数据思维和技术方案解决交互问题”。如果整篇回答都在谈交互设计原则和用户痛点,没有落到算法如何设计、数据如何利用、系统如何架构,分就不会高。
第四坑:死磕一道题导致时间失控。在线笔试系统通常在交卷前3分钟会弹提醒,很多人在最后几分钟还在改第一道编程题的代码,导致后面已经写了大半的简单题没时间提交。建议在笔试开始时先花两分钟通读全部题目,给每道题预设一个时间上限,超过上限就跳。
5.2 数据合规与平台规则:做用户行为分析的底线意识
既然笔试题大量涉及用户行为数据和产品策略,这里必须提醒一个容易被忽略但很重要的点:在真实的实习工作中,使用用户数据进行行为分析和算法建模,必须严格遵守隐私保护和数据合规要求。
具体到笔试场景中,如果你在交互场景题里提出“采集用户所有点击行为、记录每一次滑动轨迹、用摄像头监测用户表情来分析喜好”这类方案,面试官不但不会给你加分,反而可能认为你缺乏对用户隐私和数据安全的基本敬畏。合理的方案应该是在脱敏数据上进行统计建模,不采集非必要的敏感信息,对采集到的数据做访问控制和匿名化处理。
对于投稿和分享面经也一样,发布内容时不要贴出真实的公司内部文档或截图,不要泄露具体的面试题原文(除非该公司已经公开),把题目描述改写、抽象成通用的知识点,既保护了公司权益,也避免给自己带来不必要的麻烦。
5.3 面经与刷题平台的选择建议
最后聊聊准备阶段用什么资源。算法刷题方面,LeetCode的Hot 100和牛客网的名企真题是性价比最高的两个来源。LeetCode适合练基础算法和数据结构,牛客网可以模拟大厂在线笔试的真实环境。
系统设计方面,可以学习分布式系统、缓存、消息队列等基础知识,因为交互场景题可能会让你设计一个高并发下的实时推荐接口。机器学习和深度学习方面,统计学习方法(李航)、机器学习(周志华)、深度学习(花书)这三本书足够覆盖笔试的知识点范围。
人机交互理论方面,建议阅读《Designing Interfaces》和《The Design of Everyday Things》,不用读得很深,但至少要知道交互设计的基本法则、可用性测试的方法论、心智模型的概念。
我还想多说一句,笔试只是整个招聘流程的第一道关卡,通过之后更关键的其实是面试环节。面试里经常会有现场写代码、算法推导白板题、过往项目深挖这些环节,笔试的很多知识点在面试中都会被重新拷问。所以不要把准备笔试当成一个孤立的任务,不妨把它和面试准备放在一起打磨,每一道错题都值得回头深入研究。
那场笔试最终给了我面试机会,虽然那一年因为种种原因我最终没有入职网易,但那次备考过程中建立的算法体系和对人机交互方向的深度理解,影响了我后续整个职业方向的选择。每次有学弟学妹来问这个岗位怎么准备,我都会说:别把它当成一份普通的大厂实习来看待,这个岗位的笔试考察的是“技术深度+产品视野+用户同理心”的综合素质,而你认真准备这场比赛的过程,本身就是一次极其宝贵的专业成长。