2023小红书秋招后端笔试全解析:考点拆解与备考攻略
1. 写在前面为什么后端笔试值得认真复盘先聊个背景。每年8月到10月是秋招最密集的窗口各家大厂的笔试就像流水线一样排着来。小红书作为内容社区里技术栈和业务场景都比较有代表性的公司它的后端开发笔试题目向来被很多人拿来当练手素材——难度适中覆盖范围广而且很贴近真实业务场景。我前后帮几位学弟学妹梳理过这套笔试题自己也完整做了一遍。整体感受是它不搞偏题怪题不会为了难倒你而出一些竞赛级别的冷门算法但也不会让你轻松蒙混过关。它考察的东西非常“后端”——数据结构与算法的基本功、数据库设计思维、系统设计的基础素养以及你对实际业务场景的理解能力。换句话说这套题筛的不是“谁刷题最多”而是“谁真的适合做后端开发”。这篇文章就把这套笔试题从头到尾拆一遍题型结构、核心考点、典型题解思路再加上我自己总结的备考策略和踩坑记录。无论你是正在准备秋招还是刚入行想看看大厂后端笔试题长什么样这篇文章都值得收藏。2. 笔试整体结构与考点分布2.1 题型构成和分值占比2023年小红书秋招后端开发岗笔试整体分为两大部分客观题和编程题。客观题包括单选题、多选题和判断题主要考察计算机基础知识的广度和精度编程题则聚焦算法与数据结构的实际应用能力一般是三道题左右难度递增。从分值上看编程题通常占据总分的60%以上是拉开差距的关键。客观题虽然单题分值不高但胜在数量多知识点覆盖广如果基础不牢很容易在这里翻车。我整理了一下这轮笔试中客观题涉及的主要知识方向计算机网络TCP三次握手与四次挥手、HTTP状态码语义、HTTPS握手流程操作系统进程与线程的区别、死锁产生的四个必要条件、虚拟内存与页表机制数据库索引的底层数据结构与失效场景、事务的ACID特性、隔离级别与锁机制Java基础HashMap的底层实现、JVM内存区域划分、垃圾回收算法分布式基础一致性哈希、负载均衡策略、分布式锁的常见实现方式Linux基础常用命令、文件权限管理、进程状态查看客观题的特点是非常“理论联系实际”。它不会直接问“TCP三次握手是哪三次”这种死记硬背题而是会给你一个场景——比如“客户端连续发送两个SYN报文服务端会怎么处理”——让你判断对错。这就要求你对知识点的理解不能停留在表面得真的吃透原理。2.2 编程题的难度梯度设计三道编程题的难度梯度设计得比较合理。第一道题通常是“送分题”考察基本的数组操作、字符串处理或简单模拟大约对应LeetCode Easy到Medium的难度区间。这道题的目标是让大多数有备而来的候选人拿到基础分同时筛选掉完全没准备的人。第二道题开始上强度常见考法是双指针、滑动窗口、贪心算法或简单的动态规划。它有一定思维含量但不至于让人完全无从下手大概是LeetCode Medium偏Easy的水平。第三道题是真正的拉分题通常结合哈希表、堆、并查集、较复杂的动态规划或结合业务场景的算法设计。难度接近LeetCode Hard或者Medium偏Hard。这道题的目的非常明确找到那些算法能力真正过硬的候选人同时给整体成绩划定一个更高的分水岭。从实际做题体验来看这套编程题的代码量不算特别大每道题用核心的解法大概30到80行就能完成但想清楚“怎么解”比“怎么写”更耗时。笔试时间大约120到150分钟平均分配到每道编程题上大概30到40分钟加上客观题的时间预留整体时间并不宽裕。3. 核心考点深度剖析从做题到理解3.1 计算机网络考察的是“排查能力”而非“背诵能力”网络方向的题目在小红书笔试里出现频率很高。我印象最深的一道题是给出一个HTTP请求从输入URL到页面渲染的完整过程让你判断哪些步骤的描述有误。这种题本质上考察的是你对网络协议栈的综合理解而非单独的记忆。举个例子标准流程是DNS解析拿到IP → TCP三次握手建立连接 → 如果是HTTPSTLS握手协商密钥 → 发送HTTP请求 → 服务端处理并返回 → 浏览器解析渲染。很多人会把“DNS解析”放在HTTPS握手之后或者忽略浏览器缓存和CDN的存在这就是典型的“知道协议但不知道真实情况”的表现。再比如TCP的连接管理问题。三次握手和四次挥手面试中常考但笔试的考察方式往往更刁钻。它会给你一个具体场景“服务端在收到FIN报文后进入CLOSE_WAIT状态此时服务端还能不能向客户端发送数据”答案是能的。因为收到FIN只表示对方不再发送数据但本端还可以继续发送只有当本端也调用close并发出FIN后连接才真正进入关闭流程。CLOSE_WAIT状态堆积过多是后端开发中非常常见的线上问题能答对这道题的人通常会知道这个实操经验。3.2 操作系统进程、线程和并发问题的底层逻辑操作系统的考点集中在进程管理、内存管理和并发控制。有一道多选题让我印象很深它问的是哪些操作会导致进程从用户态切换到内核态。选项包括系统调用、异常事件、外设中断、进程上下文切换等。正确答案是全部都会但很多人会漏选“异常事件”因为在常规认知里“异常”是程序内部的问题不会想到它和内核态切换的关系。这里有个很关键的底层逻辑用户态和内核态的切换是操作系统的保护机制。凡是涉及资源访问、硬件操作、或者需要更高权限才能完成的操作都必须借由内核代劳。系统调用自不用说异常事件比如缺页异常需要内核来加载页面外设中断需要内核来调度处理进程上下文切换本身也由内核主导。理解了这个逻辑这类题目不管怎么变化都能答对。内存管理方面虚拟地址到物理地址的映射是核心。笔试中常涉及到的问题包括页表的作用、缺页中断的处理流程、LRU页面置换算法的基本原理。这个知识点看起来偏底层实际上对后端开发非常重要因为理解虚拟内存是理解“为什么我们能在64位系统上使用远超物理内存大小的虚拟地址空间”“为什么进程之间内存隔离”这些问题的基础。3.3 数据库索引设计真的是后端的基本功数据库方向的题目是我觉得这套笔试中“性价比”最高的部分——因为它在客观题和后面的系统设计题里反复出现。考点集中在索引、事务和锁机制上。索引部分最经典的问题是“为什么MySQL的InnoDB引擎选择B树作为索引结构而不是哈希表或二叉树”。答案的关键在于B树是多路平衡搜索树查询时间复杂度稳定在O(log N)而且叶子节点通过双向链表连接天然支持范围查询和排序操作。哈希表虽然单点查询效率更高但无法支持范围查询二叉树虽然能支持范围查询但树高会随着数据量增加而变高导致磁盘IO次数增多。事务部分ACID特性是送分题但隔离级别与并发问题的对应关系就是拉分题了。你需要清楚地知道读未提交Read Uncommitted可能产生脏读读已提交Read Committed解决脏读但可能产生不可重复读可重复读Repeatable Read解决不可重复读但可能产生幻读串行化Serializable解决所有问题但性能最差这里特别容易混淆的是“不可重复读”和“幻读”的区别。不可重复读是同一行数据在两次读取中值不同重点在“行的值变化”幻读是两次查询返回的结果集行数不同重点在“有新的行出现”。MySQL InnoDB引擎在可重复读级别下通过MVCC多版本并发控制 Next-Key Lock间隙锁记录锁的组合解决了大部分幻读问题这也是一个很常见的考点。3.4 Java基础与并发编程高频必考题作为后端开发的主流语言Java方向的题目在小红书笔试中分量不轻。HashMap是常客ConcurrentHashMap更是座上宾。这里有一个考题思路的细节变化前几年笔试喜欢问“HashMap和Hashtable的区别是什么”现在则喜欢问“HashMap在JDK 7和JDK 8中的实现差异”。这就逼着你不仅要会用还要关注新版本的特性变化。JDK 8中HashMap最大的改动是引入了红黑树。当链表长度超过阈值默认为8且数组长度大于64时链表会转换为红黑树以降低极端情况下的查询复杂度。这个设计的初衷是防止恶意构造哈希碰撞导致拒绝服务攻击。理解了这一层原因你自然会记住“阈值是8不是7也不是16”这个细节。并发编程方面synchronized和ReentrantLock的区别、volatile关键字的内存语义、CAS的无锁编程思想都是高频考点。我记得有一道题让判断volatile是否能保证原子性答案是否定的——volatile只能保证可见性和有序性不能保证复合操作的原子性。典型的例子是count这个操作它分为读取、加一、写回三步volatile无法保证这三步操作的原子性所以依然可能存在线程安全问题。4. 编程实战三道典型题的完整题解4.1 第一题字符串处理与模拟这里我根据完整做过的题目记忆还原一道非常典型的Easy难度编程题。题目描述大意是给定一个字符串要求统计其中每个字符出现的次数并按字符的ASCII码升序输出字符和对应的出现次数。这道题的标准解法是使用一个长度为128或256的整型数组作为哈希表。因为ASCII码范围是有限的直接用数组做字符计数既简单又高效。核心写法如下public String countCharacters(String s) { int[] count new int[128]; for (char c : s.toCharArray()) { count[c]; } StringBuilder sb new StringBuilder(); for (int i 0; i 128; i) { if (count[i] 0) { sb.append((char) i).append(:).append(count[i]).append(\n); } } return sb.toString().trim(); }这道题的考察点有三个。第一是否能想到用数组代替哈希表体现对数据结构特性的理解第二是否能正确处理字符与数字之间的转换避免类型错误第三边界条件是否考虑周全比如空字符串输入时应该返回空串而非空指针异常。实际笔试中这类题还会有一个变体就是要求按出现次数降序输出次数相同的按ASCII升序。这时候就不能用简单的数组遍历了需要借助map存储字符与次数的关系再通过排序或者优先队列来处理。我建议这种基础操作手写要流利因为在后续的算法题中排序和计数是极其基础且高频的思维工具。4.2 第二题滑动窗口与双指针第二题我做过的是一道典型的滑动窗口题。题目大意是给定一个字符串求出其中不含重复字符的最长子串的长度。这可能是很多人在LeetCode上刷过的原题变形但笔试里的输入输出格式可能略有不同而且数据范围可能更大要求用O(n)的解法。滑动窗口的核心思想是维护一个窗口窗口内的字符不重复。用一个哈希表记录每个字符最近出现的位置当遇到重复字符时移动窗口的左边界到重复字符上次出现位置的下一个位置。每次移动都更新当前窗口的长度并记录最大值。public int lengthOfLongestSubstring(String s) { MapCharacter, Integer lastIndex new HashMap(); int maxLen 0; int left 0; for (int right 0; right s.length(); right) { char c s.charAt(right); if (lastIndex.containsKey(c)) { left Math.max(left, lastIndex.get(c) 1); } lastIndex.put(c, right); maxLen Math.max(maxLen, right - left 1); } return maxLen; }这里有一个非常容易写错的地方为什么left Math.max(left, lastIndex.get(c) 1)不能用left lastIndex.get(c) 1直接赋值因为如果直接赋值当重复字符出现在当前窗口范围之前时左边界会被错误地向后移。比如字符串“abba”遍历到第二个“a”时此时map中记录的“a”的上次位置是0但当前窗口的左边界已经是2了如果直接用0加1得到1左边界就回退了。所以要加Math.max保证窗口只前进不后退。这类题在笔试中的变体很多比如“最长重复字符替换”“最大连续1的个数”等本质上都是滑动窗口的应用。掌握“何时扩大窗口、何时收缩窗口、何时更新答案”这三个关键点就能应对大部分滑动窗口类题目。4.3 第三题动态规划的思维强度第三题通常会上动态规划我记得考过一道类似编辑距离或最长公共子序列的变体。这类题目的特点是状态转移方程一旦找对了代码不到20行就能写完但如果在笔试的紧张氛围里状态定义没想清楚很容易卡在原地。以最长公共子序列LCS为例状态定义是dp[i][j]表示字符串text1的前i个字符与字符串text2的前j个字符的最长公共子序列长度。状态转移分为两种情况如果text1[i-1] text2[j-1]则dp[i][j] dp[i-1][j-1] 1如果不等则dp[i][j] Math.max(dp[i-1][j], dp[i][j-1])public int longestCommonSubsequence(String text1, String text2) { int m text1.length(), n text2.length(); int[][] dp new int[m 1][n 1]; for (int i 1; i m; i) { for (int j 1; j n; j) { if (text1.charAt(i - 1) text2.charAt(j - 1)) { dp[i][j] dp[i - 1][j - 1] 1; } else { dp[i][j] Math.max(dp[i - 1][j], dp[i][j - 1]); } } } return dp[m][n]; }笔试中的动态规划题想拿满分的关键在于“空间优化”。大部分DP题都可以用滚动数组把二维数组优化为一维数组内存占用更小代码也更精炼。这个优化在笔试中不一定是必须的但在后续面试的follow-up问题中几乎必考。在准备过程中建议把基础的DP题练熟练透尤其是背包问题、最长递增子序列、编辑距离这三大经典模型。它们的状态定义和转移思路可以迁移到大量变体中。4.4 编程题的提效思路写代码前的3分钟一个很实用的经验是拿到编程题后不要急着打开编辑器敲代码。先用3分钟做这几件事读题两遍圈出数据范围。数据范围决定算法复杂度上限。如果n小于1000O(n²)的解法可能就够用了如果n是10的5次方级别基本可以确定需要O(n log n)或O(n)的解法。手推一个示例。拿题目给的示例数据在纸上手动模拟一遍确认你对题意理解正确。想清楚边界情况。空输入、只有一个元素、所有元素相同、元素达到最大值这些边界情况往往是隐藏测试用例的陷阱。这个过程看起来是在“浪费时间”实际上能避免大量因为理解错题意而导致的重写和调试。尤其在笔试这种时间紧、无法向出题人提问的场景下“把题读懂”本身就是一种很重要的能力。5. 系统设计与业务场景小红书的出题偏好5.1 从“账单记录、分类管理”看后端建模能力这部分内容让我印象很深因为小红书笔试的最后一题或附加题经常会结合社区、电商、内容推荐等真实业务场景考察候选人的系统设计能力。结合2023年实际出现过的题型来看它们往往更偏“小而精”和业务强相关而不是泛泛的“设计一个秒杀系统”“设计一个短链接服务”。举个例子一道与“账单记录、分类管理”相关的设计题要求你实现一个个人记账系统的后端核心模块。这虽然是贴近生活的小项目但考察的却是后端建模能力的完整链条表结构怎么设计、接口怎么定义、数据校验怎么做、统计分析怎么实现、预算模块怎么联动。我复现过一个简化版的完整设计思路如下。核心需求有四个账单记录、分类管理、统计分析、预算管理。账单记录是最基础的功能。一笔账单包含金额、类型收入/支出、分类、时间、备注等字段。为了后续统计方便单笔账单表一般这样设计CREATE TABLE bill ( id BIGINT PRIMARY KEY AUTO_INCREMENT, user_id BIGINT NOT NULL, category_id BIGINT NOT NULL, amount DECIMAL(10,2) NOT NULL, bill_type TINYINT NOT NULL COMMENT 1收入, 2支出, bill_time DATETIME NOT NULL, remark VARCHAR(255), created_at DATETIME DEFAULT CURRENT_TIMESTAMP, KEY idx_user_time (user_id, bill_time) );这里的核心设计决定是金额字段用DECIMAL(10,2)而不是DOUBLE或FLOAT。原因很简单浮点数在计算机中本身是近似值0.1加上0.2可能等于0.30000000000000004。涉及金钱计算的场景任何精度损失都是不可接受的。这个细节在后端面试中经常被追问也体现了候选人的实战经验。分类管理在记账系统里是个容易低估复杂度的模块。分类存在父子层级比如“支出”下有“餐饮”“交通”“娱乐”而“餐饮”下可能还有“早餐”“午餐”设计时需要支持多级分类但又不能把层级搞得太深。常见的方案是parent_id自关联也可以直接schema中增加level字段来限制层级深度。表结构示意如下CREATE TABLE category ( id BIGINT PRIMARY KEY AUTO_INCREMENT, user_id BIGINT NOT NULL, name VARCHAR(50) NOT NULL, parent_id BIGINT DEFAULT 0, sort_order INT DEFAULT 0 );统计分析功能是最考验SQL能力和设计思维的部分。按日、按月、按分类聚合统计支出金额是记账系统最高频的查询场景。如果数据量不大直接对bill表做GROUP BY查询就够了。但如果你真的在做一个商用记账应用账单数据量到百万级别时就需要引入预聚合表或者定时任务来生成统计报表而不是每次实时聚合。预算管理涉及预警逻辑。它会和一个定时任务配合比如每月1号同时去“消费进度表”里把当前月份是否已超过预算额度算出来并主动推送给前端/用户。这块很多候选人容易忽略的是“预算周期与账单记录的时区问题”——如果用户在不同时区记账按自然日聚合就会出现偏差更稳健的做法是统一用UTC存储时间展示时再按用户时区转换。5.2 接口设计的“隐藏考点”除了表结构系统设计题还会考察接口设计能力。后端开发日常就是“写接口”但笔试中不会要求你完整写一套HTTP接口文档而是通过“给定场景描述你会返回哪些错误码”来探测你的工程意识。比如记账系统的新增账单接口需要考虑以下几种情况参数校验失败金额为负数、分类ID不存在、时间格式不合法权限校验失败用户未登录或token过期业务逻辑冲突当月已超过预算是否允许继续记账依赖服务异常数据库写入失败、缓存服务不可用一个成熟的接口设计会为每种情况定义明确的错误码和错误信息而不是简单地返回一个500或者“系统错误”。合理的错误码设计能极大提高前后端联调效率也是后端工程化能力的重要体现。5.3 分布式与微服务出现频次在提升2023年的笔试中分布式方向的题目明显比前几年多了。这类题目考察的不是你能背多少分布式理论名词而是你能不能把分布式的基本思想应用到具体场景中。分布式锁是一个高概率考点。它的实现方式通常有三种基于数据库的唯一约束基于Redis的SETNX命令基于ZooKeeper的临时有序节点基于Redis实现是最流行的方案这里有个关键细节在Redis 2.6.12版本之后获取锁和设置过期时间可以合并为一个原子操作——SET lock_key unique_value NX PX 30000其中NX表示只有当key不存在时才设置成功PX 30000表示锁的自动过期时间为30秒。如果分开执行SETNX和EXPIRE两条命令中间宕机会导致锁永远无法释放这就是经典的分布式锁“死锁”隐患。一致性哈希也是常考内容。它解决的核心问题是在分布式缓存场景中当缓存节点数量发生变化时尽可能少地影响已有的数据映射关系。普通的哈希取模方案在节点数量变化时会导致大量缓存失效引发缓存雪崩一致性哈希通过哈希环和虚拟节点的设计把影响范围控制在较小范围内。笔试中可能会以选择题的形式考察“当节点从3个扩展到4个时有多少比例的数据需要重新映射”这类问题答案是一致性哈希大约只有1/n的数据受影响而普通取模是几乎所有数据都要重新映射。6. 客观题避坑指南与高频错题6.1 计算机网络类易错点HTTP状态码是我每年看笔试题目都会发现有人栽跟头的知识点。很多人只记得200是成功、404是找不到、500是服务器错误但HTTP协议中那些不那么常用的状态码才是笔试的拉分点。301和302的区别就是一个典型案例。301是永久重定向表示资源已经被永久性地移动到了新地址浏览器和搜索引擎会缓存这个跳转302是临时重定向表示资源暂时在别处下一次访问时还得再问原地址。简单说301意味着“以后都去新地址找我”302意味着“这次先在新地址找我下次还回到这里问”。这个细节在URL规范化、域名更换、登录跳转等场景中都有实际应用。另外HTTP和HTTPS的默认端口80和443、TCP的TIME_WAIT状态持续时间2MSL、DNS查询使用的传输层协议UDP为主但区域传送用TCP也都是高频考点。这些知识点看似零碎但都是后端开发日常排查问题时的基础工具。6.2 操作系统类易错点进程与线程是经典的考点但笔试往往考得更细。比如问“进程间通信的方式有哪些”答案包括管道、消息队列、共享内存、信号量、Socket、信号。很多人会漏掉信号Signal因为它不是那么“程序员友好”的通信方式但它确实是操作系统提供的进程间异步通知机制。还有一个容易混淆的点是“孤儿进程”与“僵尸进程”。孤儿进程是父进程先退出子进程被init进程收养不会造成问题僵尸进程是子进程先退出但父进程没有调用wait/waitpid来回收子进程的退出状态导致进程表中残留了一个“僵尸”条目。僵尸进程不占用CPU和内存但会占用进程号如果大量堆积会导致系统无法创建新进程。这个话题在面试中经常延伸为“怎么避免僵尸进程”答案就是父进程必须用wait/waitpid或者signal(SIGCHLD, SIG_IGN)来正确处理子进程的退出事件。6.3 数据库类易错点B树和B树的区别是数据库方向最常考的题目之一笔试中多以选择题形式出现。B树相比B树的几个关键差异数据只存储在叶子节点非叶子节点只存储索引键叶子节点之间通过指针相连形成有序链表树的高度通常更矮磁盘IO次数更少。这些特性让B树天然适合作为数据库和文件系统的索引结构。索引失效场景也是高频考点。最常见的索引失效情况有对索引列使用函数或计算、隐式类型转换比如索引列是varchar类型但查询条件是数字、LIKE以通配符开头、OR连接的非索引列条件等。很多候选人只记得“对索引列用函数会导致索引失效”这个结论但不知道为什么。原因在于索引树的键值存储的是原始数据如果对列值做了函数变换数据库无法直接利用索引树中的键值进行匹配只能全表扫描。理解了原理就不容易记混。6.4 Java并发类易错点Java并发相关的题目通常分布在“多选”或“判断”题中。一个典型的题目是“以下哪些操作是线程安全的”选项包括HashMap、Hashtable、ConcurrentHashMap、ArrayList、CopyOnWriteArrayList、StringBuilder、StringBuffer。这里需要非常清楚HashMap非线程安全多线程写入可能导致链表成环JDK 7或数据覆盖JDK 8Hashtable线程安全但并发性能极差因为所有方法都用synchronized锁住整个表ConcurrentHashMap线程安全且性能优异JDK 8之后采用CAS synchronized精确锁定单个桶ArrayList非线程安全多线程遍历修改会抛出ConcurrentModificationExceptionCopyOnWriteArrayList线程安全写时复制策略读操作无锁StringBuilder非线程安全但在单线程场景下性能更好StringBuffer线程安全所有方法都用synchronized修饰这个知识点没有捷径只能靠理解每个类的设计原理来记忆。比如CopyOnWriteArrayList为什么读操作无锁因为读操作操作的是原来的数组快照写操作则先复制一个新数组、在新数组上修改、最后替换数组引用。这样读线程永远不需要等待写线程。7. 备考路线与实操建议7.1 时间安排三个阶段的备考节奏如果你现在距离秋招笔试还有大概两个月我建议把备考分成三个阶段。第一阶段第1到3周系统梳理基础知识。以计算机网络、操作系统、数据库、Java基础、分布式基础这五个方向为主线每天固定投入时间阅读经典书籍。这个阶段不需要大量刷题重点是建立完整的知识框架。建议使用《图解HTTP》《深入理解计算机系统》选读操作系统相关章节《高性能MySQL》选读索引和事务章节《Java并发编程的艺术》作为主线材料。第二阶段第4到6周算法题专项突破。每天至少完成3到5道LeetCode或牛客网的真题按题型分类刷题。重点关注数组与字符串、双指针、滑动窗口、哈希表、二叉树、递归回溯、动态规划、贪心算法这八类。每做完一道题花5分钟写下题解思路和复杂度分析形成自己的解题模板。第三阶段第7到8周模拟笔试与查漏补缺。每周安排两到三次完整的模拟笔试严格计时模拟真实的考试环境。做完后重点复盘错题分析原因是知识点遗忘、思路不清晰还是代码实现有bug。这一阶段还需要有意识地训练“时间分配能力”客观题卡住超过2分钟就先跳过编程题超过20分钟没思路就换个角度保证每道题都能拿到步骤分。7.2 学习路线中容易忽略的三个方向根据我观察到的笔试实际出题趋势有三个方向是很多自学候选人容易忽略的。第一个是Linux基础。很多候选人能背出Linux常用命令、能说出文件权限rwx的含义但笔试中如果考到“如何查看哪个进程占用了8080端口”“如何查看系统负载”“如何定时执行一个脚本”这类问题还是会卡壳。建议实际操作一遍在虚拟机或云服务器上把常用的进程管理、端口排查、日志分析命令都跑一遍记忆会深刻得多。第二个是网络排查。TCP的三次握手和四次挥手人人都会背但笔试中如果给出一个tcpdump抓包结果让你判断连接状态就很少有人能答对了。建议用Wireshark或tcpdump实际抓一次HTTP请求的包观察三次握手和HTTP数据传输的过程把课本知识和真实世界连接起来。第三个是项目经验的书面化表达能力。笔试中经常出现“你做过的一个项目中最难解决的问题是什么”这类开放性题目这虽然不是技术题但很考验候选人的表达能力和复盘深度。建议提前准备1到2个自己参与度最高的项目写清楚项目背景、你的职责、遇到的技术难点和解决方案这既是笔试的储备也是面试的弹药。7.3 编程题刷题的“两遍法”刷算法题是一个讲究效率的过程。我自己比较推荐“两遍法”。第一遍是“独立思考”。拿到一道题先自己画图、举例子、推导思路不管能不能做出来至少给自己20到30分钟的独立思考时间。这一遍的意义在于训练“在紧张环境下从零开始解决问题的能力”这是笔试最需要的能力。第二遍是“标准答案学习”。独立完成后去看题解区的高票答案重点关注别人的思路和自己有什么不同、代码有哪些细节处理得更好。然后用标准的解法重新写一遍注意时间和空间复杂度再对比自己的第一版代码找出差距。这两遍下来一道题才算真正吃透。表面上看起来比“直接抄答案刷题”慢很多但效果是几何级别的差距。笔试考的从来不是你见过多少题而是你能不能把见过的题转化为自己的思维模式。8. 常见问题与考场实战心得8.1 时间不够用怎么破笔试时间不够是绝大多数人的痛点我见过不少候选人客观题答得不错但编程题只写完第一道后面两道基本空白。这种情况非常可惜因为编程题的分数占比远高于客观题。我自己的策略是先快速扫一遍所有题目判断每道编程题的大致难度。按“先易后难”的顺序开始答题先保证Easy题完美AC再攻Medium题最后有余力再挑战Hard题。客观题控制在每道题1分钟以内如果超过1分钟没有明确思路先在题目上做个标记等编程题写完了再回头思考。还有一个细节是做题过程中如果你已经提交了一个通过部分测试用例的代码先别急着优化。这一版至少能拿到部分分数如果优化的时间不够也不至于交白卷。考试就是为了拿分不要追求完美主义。8.2 编译环境与IDE不熟悉怎么应对小红书采用的是在线笔试平台代码编辑器是网页端的和本地的IntelliJ IDEA、VS Code在使用体验上有差异。很多候选人平时用惯了IDE的自动补全、代码提示、一键格式化到了不熟悉的网页编辑器里连基本的括号配对都容易出错。解决办法是在笔试前提前去牛客网或者公司自己的在线笔试平台上做几次模拟题适应这种“裸写代码”的环境。另外练习时建议逐渐减少对IDE补全功能的依赖尤其是一些常见的类名、方法名和API比如HashMap的常用方法、String类的常用操作要做到能直接默写出来。8.3 遇到完全没思路的题怎么办笔试中遇到完全没有思路的题切记不要白白空着。可以用暴力解法先写一版比如直接双重循环解决问题虽然时间复杂度高但至少逻辑是对的能拿到一部分测试用例的分数。更进一步的技巧是“从暴力到优雅”的渐进式优化。先写一个能正确运行的暴力解跑通示例测试用例后再分析时间开销在哪里思考能否通过缓存、排序、双指针等方式降低复杂度。这个“先跑通再优化”的思路在紧张的笔试环境中远比“从头想要一个完美解”更务实。如果连暴力解都写不出来那就把思路和伪代码写在代码注释里让阅卷者看到你的思考过程。部分笔试平台有“人工阅卷”环节清晰的思路也能为你争取一些印象分。8.4 笔试结束后的复盘方法很多人考完笔试就彻底放松等结果去了。这个习惯其实很亏。笔试不像面试结束后你能记住的题目和思路是最清晰的建议当天晚上就做一次完整的复盘。复盘的内容包括三块。第一把编程题的思路和代码重新整理一遍尝试用不同的解法再写一遍第二把客观题中拿不准的题目整理成错题本标注考点和正确答案第三评估整体的时间分配是否合理找到接下来需要针对性加强的模块。坚持做完这三步你会发现“笔试本身”的价值已经超过了“拿到面试机会”这件事。它是一面镜子能照出你知识体系中真正薄弱的地方而这些地方恰恰是后续面试中最可能暴露的问题。9. 最后分享几个实操小技巧这套笔试我完整带人做过不止一遍有几个小技巧是我个人经验里最值得拿出来分享的。第一笔试前把输入输出模板准备好。不同在线笔试平台的输入输出格式不一样有的是标准输入有的是封装好的接口。提前熟悉目标平台的ACAccepted代码模板能省下考试中大量调试I/O的时间。尤其是用Java写算法题时BufferedReader和StringTokenizer的效率比Scanner高很多在大数据量场景下差距明显。第二善用“打印中间结果”的方式调试。笔试环境通常不支持断点调试最多只能通过打印来观察中间状态。写代码时不要吝啬加打印语句尤其是在循环和边界条件附近。确认逻辑正确后再统一删除打印语句并提交不删除也没关系只要不产生多余输出即可。第三经典的排序、查找、遍历代码要能闭着眼睛写出来。二分查找的边界条件、归并排序的合并过程、树的三种遍历方式、并查集的路径压缩这些基础操作是很多算法题的“零件”。零件装得越熟练组装完整解决方案的速度就越快。笔试说到底是一场“在有限时间内展示你编程和思维能力”的测验它没有办法100%反映一个人的真实水平但准备充分的人和裸考的人之间的差距在分数上看是非常明显的。希望这篇拆解能帮你把备考的思路理清楚少走一些弯路。