
相信不少正在经历春招的同学看到这个标题都会心头一紧——2024年春招小红书研发岗第三批笔试。我身边好几个朋友都卡在这个环节上有的是算法题没AC出来有的是选择题耗时太多最后大题没时间写。我自己是完整走完了网申→笔试→面试→Offer全流程的人所以想把这批笔试的考察方向、题型分布和实操复盘写下来给后面投递的同学一个真实参考。先说结论小红书研发岗的笔试在各大厂的笔试难度排序里属于中上等——它不会像某些大厂那样上来就甩一道Hard压轴劝退你但也不会让你轻轻松松一个半小时交卷走人。它的题目设计明显带着内容平台搜推场景的业务影子算法题偏爱字符串处理、哈希表、拓扑排序这类实用型考点而不是纯粹的竞赛思维题。这篇文章主要面向正在准备或即将参加互联网公司研发笔试的应届生以及想了解大厂笔试流程、提前做针对性准备的准求职者。我会从题型结构、核心考点、答题策略、常见坑点四个维度展开尽量把能复现的经验都说透。1. 笔试整体设计与考察思路拆解1.1 三批笔试的时间线与批次逻辑先说背景。小红书的春季校园招聘一般会在2月底到3月初启动网申紧接着分批安排笔试。2024年春招的笔试分了多个批次第三批通常安排在3月中下旬到4月初具体时间以邮件和短信通知为准。这里有个值得注意的细节笔试批次不是按投递时间严格划分的而是招聘系统按投递数量部门筛选节奏动态分批发券。也就是说你越早投递越有可能被分到前面的批次但如果你在简历筛选环节被某部门挂掉又转推荐到了其他部门笔试批次可能就会顺延。所以第三批并不意味着你的简历质量靠后只是整个筛选链条上的时间位置不同。从整个流程来看小红书春招的节奏是网申→在线笔试→技术面试一般2-3轮→HR面→Offer。笔试作为简历筛选后的第一道技术关卡它的核心作用不是选拔天才而是用统一标准过滤掉基础不扎实的候选人。这就引出了一个对求职者非常有利的推论笔试并不要求你每题都会只要你在同批候选人中处于相对靠前的位置就有机会进入面试。1.2 为什么笔试题目长这样岗位视角的考点映射很多同学刷题时有一个误区拿LeetCode按题号顺序一个Hard一个Hard地刷觉得只要刷得够难、够多笔试就稳了。但实际上去年这批小红书笔试真题摆出来你会发现它的考点选择非常有讲究。小红书的核心业务是内容社区搜索推荐海量UGC内容意味着海量的文本数据处理社区互动关注、点赞、评论意味着大量的图结构关系用户增长和留存又涉及到各种策略模拟。所以笔试题目里频繁出现的字符串处理、哈希表、图论拓扑排序、区间合并其实都是在模拟真实业务场景中的抽象问题。比如字符串题目背后对应的可能是内容的敏感词过滤、关键词抽取、标签匹配拓扑排序对应的可能是用户关系链的依赖解析、任务调度。这一点和某些纯游戏公司或金融科技公司的笔试风格有明显差异——后者更偏向数学建模和概率统计。摸清这个思路后备考方向就清楚了与其盲目刷难题不如把高频考点刷透。我会在下一节详细列出去年批次的题型分布和算法考点频率。2. 核心考点与题型结构详解2.1 题型分布选择题算法题一道附加设计题小红书研发岗笔试的客观题部分通常是选择题单选和多选混合数量在20-30道之间。考察范围覆盖计算机网络TCP/UDP、HTTP状态码、DNS解析流程、操作系统进程线程、死锁条件、虚拟内存、数据库索引原理、隔离级别、SQL优化、编程语言基础如果你是Java岗会重点考Java集合类、并发包、JVM内存区域如果是Go岗会重点考goroutine调度、channel原理、defer机制以及一些计算机基础常识。这里有一个很实用的经验选择题千万不要在一道题上卡超过两分钟。去年我身边有位同学前面选择题做得特别认真有一道关于MySQL索引失效的题目冥思苦想了快十分钟结果后面三道算法题里最简单的那道送分题都没时间写完最终遗憾挂掉。笔试系统通常不允许题目之间切换后保留高亮标记所以遇到不确定的题先凭第一直觉选一个并标记待复核等算法题做完有剩余时间再回头斟酌。因为算法题占分比例一般远高于选择题一道AC的算法题可能就顶得上五道选择题的分值。2.2 算法题高频考点字符串、哈希、拓扑与区间算法题部分一般是两道到三道难度呈阶梯状分布。根据我对去年多批笔试题目回忆整理的频率来看以下几个考点出现概率极高字符串处理类字符串匹配、分隔解析、子串统计。这类题通常需要用哈希表记录频次、用滑动窗口维护窗口内状态。去年第三批有一道反转字符串中的单词顺序并要求保留单词内部字符顺序不变的变种题本质就是在考边界处理和split的坑。哈希表与计数本质上是在考空间换时间的思维。大批题目都能用HashMap一遍遍历解决但注意处理Map中不存在key时的默认值逻辑以及value是List时的初始化写法。图论与拓扑排序小红书笔试特别喜欢出依赖关系类题目。比如给定若干任务任务之间有先后依赖关系要求输出一种可行的执行顺序或者判断是否存在环。这类题用邻接表建图入度表BFS即可Kahn算法的模板要背熟。区间合并与贪心会议室安排、合并重叠区间、加油站问题。这类题的套路很固定先按区间起点排序再顺序遍历合并。去年有一道合并所有重叠区间并输出合并后区间的数量就属于这个类型。从题型趋势来看小红书笔试出现纯Hard级别的竞赛题频率不高更常见的是中等难度偏上、但可以靠细心拿满分的题目。所以备考时把中等题刷熟比死磕Hard性价比高得多。2.3 一个容易被忽视的细节笔试中的ACM模式这里必须敲黑板提醒小红书笔试的算法题采用的是ACM模式也就是你要自己处理标准输入输出而不是像LeetCode那样只需要补全函数体。很多平时只用LeetCode刷题的同学第一次上笔试系统时会因为不会写Scanner或fmt.Scan而白白丢分。我记得去年第三批笔试时有一个朋友在两道算法题上逻辑完全正确但就是因为输入循环没写对导致本地样例能过、线上却一直报运行时错误最后心态有点崩。所以我在后面专门列了一个小节讲ACM模式下的输入输出模板这个部分直接决定了你的AC率务必重视。3. 实操过程笔试全流程复盘与答题策略3.1 笔试前的准备清单基于我自己以及身边同学的实操经验我把笔试前的准备分为四个维度你可以直接对照检查环境准备确保电脑有稳定电源、网络畅通、摄像头可用部分批次会要求开启摄像头监控。笔试前一周提前在牛客网刷两套模拟题熟悉在线编码页面的布局和编译运行方式。实际上牛客网模考环节非常重要因为很多在线编辑器不会自动保存你写着写着如果不小心按了刷新代码就全没了。语言选择小红书笔试支持的语言种类比较多常见的有Java、C、Python、Go、JavaScript等。我强烈建议你选自己最熟的那门不要临时切换。Java选手要额外注意在线编辑器默认不自动导入java.util.*包名要自己写全Python选手则要注意输入是strip还是split以及Python的递归深度限制会不会在深搜题目里踩坑。模板准备笔试前把常见的算法模板过一遍。下面我给出高频模板清单按出现频率排序二分查找包括左边界、右边界、寻找插入位置单调栈模板解决下一个更大元素类问题拓扑排序Kahn算法模板Dijkstra最短路模板并查集模板前缀和与差分模板模板不要求背得一字不差但至少要能在三分钟之内默写出来并且知道每个步骤在干什么。注意千万不要开考后马上敲模板然后粘贴。笔试系统通常有代码相似度检测如果多题的核心结构完全一致有被判定作弊的风险。模板的作用是建立快速复现的肌肉记忆不是让你直接复制粘贴。战术规划正式的笔试时间一般在1.5到2小时之间。我的建议是拿到试卷后先用5分钟浏览所有题目评估每道题的难度和自己的熟练度然后按先易后难的顺序做题。这里有一个原则先拿满所有送分题再做中等题最后攻克难题。送分题指那种思路非常明确的题比如一道裸的两数之和变体或者一道直接套模板的拓扑排序。不要在一道题上死磕超过20分钟如果卡住了先跳过做完其他题再回头想。3.2 核心代码实现一个典型的拓扑排序题目为了让你更直观地了解笔试现场的答题思路我拿去年第三批笔试中出现过的一道经典题目来完整复盘课程安排II——给定课程数numCourses和先修课程对数组prerequisites输出一种可行的课程学习顺序如果存在环则返回空数组。import java.util.*; public class Main { public static void main(String[] args) { Scanner scanner new Scanner(System.in); // 重点处理多行输入直到没有下一个整数为止 while (scanner.hasNext()) { int numCourses scanner.nextInt(); int m scanner.nextInt(); int[][] prerequisites new int[m][2]; for (int i 0; i m; i) { prerequisites[i][0] scanner.nextInt(); prerequisites[i][1] scanner.nextInt(); } int[] result findOrder(numCourses, prerequisites); if (result.length 0) { System.out.println([]); } else { StringBuilder sb new StringBuilder(); for (int i 0; i result.length; i) { if (i 0) sb.append( ); sb.append(result[i]); } System.out.println(sb.toString()); } } } public static int[] findOrder(int numCourses, int[][] prerequisites) { ListListInteger graph new ArrayList(); int[] indegree new int[numCourses]; for (int i 0; i numCourses; i) { graph.add(new ArrayList()); } // 建图prerequisites[i] [a, b] 表示先修b再修a for (int[] edge : prerequisites) { int a edge[0]; int b edge[1]; graph.get(b).add(a); indegree[a]; } QueueInteger queue new LinkedList(); for (int i 0; i numCourses; i) { if (indegree[i] 0) { queue.offer(i); } } int[] order new int[numCourses]; int index 0; while (!queue.isEmpty()) { int cur queue.poll(); order[index] cur; for (int next : graph.get(cur)) { indegree[next]--; if (indegree[next] 0) { queue.offer(next); } } } return index numCourses ? order : new int[0]; } }这个代码在现场答题时有几个特别容易被忽略的坑点输入行数不固定有些题目不会明确给出用例组数而是靠hasNext循环读取直到EOF。如果你只写了一次nextInt就会只处理第一组数据导致部分用例报错。输出格式要求有的题目要求输出[0,1,2]这样的带括号格式有的要求每行一个数字。务必在写代码前先读清题目描述中的输出要求。数组长度判断当存在环时返回空数组而不是null。很多人在这一步随手写了return null结果输出时空指针或格式错误。3.3 我的现场答题节奏参考以去年这批笔试为例整体时间我觉得可以按这样的节奏分配前5分钟浏览全部题目并做简单标记选择题用35到40分钟解决平均每题1到1.5分钟算法题留70到80分钟。如果算法题总共有三道时间分配建议是最简单的那题15分钟中等题25分钟难题30分钟剩下15分钟做检查和补漏。实际做题过程中如果你15分钟过去了还完全没有清晰思路果断标记并跳到下一题不要恋战。等所有会做的题都做完了再回头做跳过的题这个时候心态会沉稳很多常常能发现刚才遗漏的突破口。我印象很深刻的是去年第三批考了一道合并区间变形的中等题。一开始我用了最朴素的排序遍历法写完跑样例通过了但提交后发现有一组大数据量用例超时。我没有马上陷入恐慌而是冷静分析复杂度排序O(nlogn)不可能超时问题肯定出在遍历里的某个操作用了线性查找导致退化成了O(n^2)。我看了一眼代码果然是在合并逻辑里用了一个List.contains来判重。把这段改成哈希Set之后所有用例全部通过。所以我要特别强调全部样例过了并不代表能AC线上环境的数据量往往比样例大几个量级你在本地测试时如果想当然地认为能跑就行很可能在隐藏的大数据用例上翻车。4. 常见问题与避坑指南4.1 笔试中容易踩坑的五个环节我整理了一下自己和身边同学的踩坑记录集中在以下五个方面你对照一遍至少能避免一半的意外浏览器兼容与弹窗拦截在线笔试页面一般建议使用Chrome或Edge最新版本。部分同学的浏览器安装了广告拦截插件导致考试系统弹窗被拦截页面无法正常加载。建议笔试前把考试域名加入白名单或者干脆用无痕模式打开考试链接。本地IDE与在线编辑器的差异很多人习惯在本地IDE里写完代码再粘贴到在线编辑器。这样做倒也没问题但一定注意本地IDE能通过编译不代表线上也能通过因为在线系统往往使用不同的JDK/GCC版本。特别是Java的泛型、lambda表达式在不同版本的兼容性存在差异Python的f-string在3.6以下不支持。建议笔试前确认在线系统支持的语言版本。样例通过但全错这种情况几乎所有笔试都会遇到。常见原因有没有处理多组输入、没有对输入做trim处理、整数溢出用int而没用long、数组越界。我的建议是提交前花两分钟对边界条件做一个暴力自查如果数组长度为0会怎样如果输入全是最大值会怎样如果只有一个元素会怎样时间耗尽才想起有附加题部分批次的选择题后面会有一道简答题或设计题占分不一定多但写几句有逻辑的回答往往比空白强很多。建议开考前先快速滚动一遍整个试卷确认总题量和题型结构。网络掉线笔试过程中网络中断会非常影响心态。现在大部分笔试系统支持断线重连但掉线期间的进度能否保存取决于具体系统。为了避免这种小概率事件建议插网线不要用公用WiFi并且提前准备手机热点作为备用。4.2 笔试常见问题速查表问题现象可能原因建议解决方式输入读取为null没有处理多组输入或题目要求读完整行却被nextInt跳过了使用前缀读取或用nextLine()后手动split本地运行正常、在线报运行时错误数组越界、递归深度溢出、断点调试代码未删除检查数组边界需要时显示声明栈或改为迭代Java题提交后提示答案错误且用例通过率很低没有考虑多个prerequisites的先后顺序或返回值方向反了重新读题尤其是先修b再修a的方向千万不能搞反输出格式不符合预期多打了空格或少了换行对比题目给出的输出样例注意行尾空格感觉代码逻辑对但始终超时使用了O(n^2)暴力解法或提交后仍有调试输出想想是否有更优算法确认没有System.out.println残留4.3 面试官视角笔试到底在筛什么有些同学笔试挂了之后会陷入自我怀疑我刷了三百题为什么笔试还是挂这里我想多说两句。站在面试官的角度笔试成绩并不是一票否决它更像是一个信号系统。如果你算法题AC了两道说明你的编码基本功扎实可以直接进入技术面重点聊项目如果你只AC了一道但选择题正确率很高、代码风格清晰面试官也会给你机会。反过来如果选择了全对但算法题一道都没写出来大概率会被筛掉——因为对于研发岗来说代码能力是底线。这也解释了为什么我在前面反复强调先易后难、保证AC率。笔试并不可怕可怕的是你用错了策略把最宝贵的时间砸在了最不该纠结的题目上。如果你只有把握AC一道题那就确保这道题AC得干干净净边界条件、输入输出、时间复杂度和空间复杂度全部无懈可击。5. 笔试复盘与后续面试衔接5.1 笔试结束后应该在24小时内做什么笔试结束不代表这件事就翻篇了。我自己有个习惯也是想推荐给大家的做法笔试结束后24小时内趁记忆还热乎着把每道题的题目描述、自己的思路、实际提交的代码、卡住的地方整理成一篇复盘笔记。原因有两点第一笔试中的题目质量一般较高很多是业务场景提炼出来的中型算法题比LeetCode上的抽象题更有实际感。做一遍后立刻复盘能极大加深对这类题型的印象。我当时复盘的拓扑排序题目后来在小红书技术面手撕算法环节竟然又考了一道几乎同构的变形题因为刚做过复盘思路还没忘写起来非常顺畅。第二如果笔试挂了复盘笔记就是你向HR或面试官争取加面的底气。虽然不保证有用但你可以礼貌地发一封邮件附上你对笔试题目更优解的思考展示你的反思能力。这个操作在部分公司确实产生过奇效但注意措辞要谦逊不要给人一种我没错都是系统错的感觉。5.2 内容平台岗位如何借笔试经验助攻面试讲一个比较实际的经验笔试中遇到过的题型完全可以拿来当面试中展示业务理解的材料。比如你在笔试里做了一道敏感词匹配变体题那么在面试聊项目的时候你就可以主动提到我做过类似的内容安全过滤场景用的是多模式串匹配的AC自动机思路处理海量UGC文本时能在线性时间内完成匹配。这句话一出来面试官往往眼前一亮因为大多数候选人在面试时只会讲自己做过的项目很少有人能把笔试中遇到的题和业务场景结合得这么好。所以备考笔试不要只把它当成一场考试更关键的是要读懂题目背后的业务隐喻。小红书作为一个内容社区平台它的题目大概率会围绕内容分发、搜索排序、用户关系、审核风控这些核心链路出题。你在刷题时多问自己一句这道题如果出现在我们的业务场景里对应的是哪个环节面试时的表达层次会完全不同。5.3 如果笔试不理想还有没有补救机会说实话笔试不理想并不意味着完全没有机会。校招最大的特点就是流程长、环节多、变化多。如果你笔试表现一般但简历中有特别亮眼的项目经验或竞赛背景部分部门会在筛选中放宽笔试门槛。此外春招过程中有些部门因为HC没招满会临时启动补录流程届时有可能会开放绿色通道。所以我的建议是不要因为一次笔试的失利就停下来保持每周至少两到三次的刷题频率同时持续关注招聘官网和牛客网上的补录信息。机会总是留给有准备的人这句话虽然老套但在求职场景下确实是铁律。写在最后一点真实的个人体会刷题备考这件事和真正坐在笔试考场里的感受是完全不同的。我去年备考时总觉得我刷得还不够多结果真到了笔试现场发现最难的并不是那些压轴题而是如何在有限时间内稳定输出不犯低级错误。笔试考的不只是算法能力更是时间分配能力、抗压能力和边界思维。这些能力只能通过模拟考试和反复复盘慢慢培养。如果你正在准备下一批笔试这套备考思路和复盘方法希望能帮你少走一些弯路。祝笔试顺利早点拿到心仪的面试邀请。