先说结论东华复试OJ的二刷绝不只是把所有题再做一遍那么简单。真正拉开差距的是你在第二次接触同一道题时能不能用比第一次更短的时间写出更稳的代码能不能在考场那种紧张环境下把曾经AC过的思路瞬间变成手下的键盘声。这篇复盘8是我的系列第8篇前面记录了踩坑、刷题节奏、重点题型这次想专门聊聊二刷这件事本身——它和首刷的差别、复盘的具体方法、以及那些藏在OJ判题规则里的隐形陷阱。很多人初试分数不错结果复试上机一塌糊涂。原因往往只有一个把OJ刷题理解成了看题解、抄代码、AC了就往下走。这个流程应付初试的笔试还行但在复试上机这种白纸写代码、错了当场掉分的场景里根本扛不住。我二刷阶段最大的体悟是OJ刷题的核心不是做过而是能在限时场景下独立做对复盘的产出也不是一份错题文档而是一套自己能快速调用的解题模板和边界条件清单。写这篇复盘时我又把过去几周的刷题记录、错题归因表、以及考场环境中容易翻车的细节全部过了一遍尽量把对后来人有用的内容拧干水分直接给你能用的东西。如果你也在准备研究生复试的上机考试这篇文章应该能帮你少走不少弯路。1. 二刷到底在刷什么从记忆性AC到理解性AC1.1 首刷和二刷的根本差别首刷时大多数人是什么状态打开题目读一遍脑海里隐约有思路不确定于是翻题解看完恍然大悟照着敲一遍AC了下一题。这种流程其实是在背答案而不是在练能力。等过两周你再遇到一模一样的题可能记得这题是用栈做的但真要你在空白编辑器里从零写出来卡在栈顶操作或者边界条件上半天的情况我见过太多。二刷的意义就在这里把每一道题当作全新的题目不参考任何题解强迫自己在有限时间内独立完成。你会发现那些你以为会了的题实际独立写起来漏洞百出。比如一道非常经典的链表反转题首刷时照着递归版题解敲一遍当时觉得自己懂了二刷时自己动手迭代法指针顺序稍不留神就搞丢一个节点递归法边界条件一写就错。这不是你笨而是首刷建立的记忆压根没有和内层的能力挂钩。二刷的正确打开方式是读题之后先在草稿纸上写下算法步骤、时间复杂度和边界条件然后直接写代码跑测试用例提交。如果WA了不要急着看题解先自己调试打印中间变量定位问题。这个过程才是真正涨功力的地方。我二刷时经常遇到WA三次才找到边界问题的题但正因为是自己找到的这个边界条件从此以后就长在我脑子里了。1.2 用一道典型题目拆解二刷步骤拿树的层序遍历来举例这类题在复试OJ里出现频率很高。首刷时你可能是照着队列的模板写的二刷时我建议按以下流程走一遍第一步不看任何参考定义TreeNode结构体考虑空树的情况第二步想清楚层序遍历到底用队列还是可以用递归实现各自的空间复杂度如何第三步写出代码后人为构造三个测试用例空树、单节点树、三层满二叉树第四步提交后如果出现段错误先检查是不是对NULL指针解引用如果是输出的格式问题检查行尾空格。这一套流程走完你对这道题的理解深度远超首刷时的十遍。因为你在复现思路、构造边界、调试排错而不是在复读答案。二刷的正确标准不是AC了而是关掉题解随手能写出、写对、还能说出为什么这样写。1.3 知识框架在二刷时才会真正建立首刷是把题一道道做过去知识点是零散的二刷时你会发现很多题其实在考察同一组核心能力。我二刷到第5周时明显感觉到脑子里的知识开始从题目列表变成了算法图谱遇到求连通块数量自动联想到DFS/BFS加visited数组遇到区间合并自动想到排序后贪心扫描遇到大数运算自动想到用字符串模拟进位。这种联想能力不会在首刷时出现只能通过二刷时的归纳总结来建立。建议你在二刷每道题之后顺手记下这道题属于什么类型、用了什么核心数据结构、有哪些必写的模板代码。等一个专题刷完再回头统计哪些类型自己最顺手哪些类型每次都要卡壳。这个统计结果就是你接下来重点强攻的方向。2. 复试题目优先级排序东华复试OJ到底爱考什么2.1 题目分布的经验判断我不是东华官方没资格说必考哪些题但根据历年考生反馈和多个OJ平台杭电OJ、郑轻OJ、东方博宜OJ等上复试难度区间题目的分布规律可以给你一个优先级参考。复试上机的时间通常在2小时左右题量一般是3到5道难度分布照顾大多数本科毕业生的平均水平不会出太偏的竞赛题但会在基础题里埋一些边界条件的陷阱。按重要性从高到低我把常见考点分成四档整理成表格方便你对照优先级考点类型典型题目建议重视程度P0基础模拟与简单计算日期计算、进制转换、字符串处理必须滚瓜烂熟P0线性数据结构栈、队列、链表操作必须能默写模板P1经典搜索DFS、BFS、连通块、最短步数高频且必须会P1经典排序与二分各种排序、二分查找边界中高频P2二叉树建树、遍历、公共祖先视复习时间而定P2动态规划基础背包、最长公共子序列、最长上升子序列视复习时间而定P3图论与并查集最小生成树、最短路时间充裕再准备2.2 为什么说模拟题反而是复试胜负手初试笔试里大家最怕的是动态规划这种想不出来就完蛋的题但复试上机恰恰相反最决定命运的反而是那些看起来毫无技术含量的模拟题。道理很简单上机考试比的是AC数量而模拟题只要思路清晰、代码功底扎实是稳定拿分的题动态规划你一旦卡住可能就是0分。模拟题里最典型的就是日期问题比如给定两个日期计算相差天数。这题在郑轻OJ、杭电OJ上都是入门经典但你真在考场上独立写一遍会发现坑不少闰年判断条件、跨年计算、边界日期的取舍稍不小心就WA。二刷时一定要把这类题的代码写到肌肉记忆的程度因为考场上紧张状态下你大概率没有余力去现场推导闰年公式。我二刷给自己定的标准是P0级别的题看到题目后5分钟内能写出大框架15分钟内能提交AC而且完全不用查资料。这个标准听起来苛刻其实练到后期你会发现这类题的套路太固定了形成肌肉记忆之后它们反而是你稳定军心的得分点。2.3 二刷的专题顺序建议如果你时间充裕二刷建议按专题来而不是按题号一题一题往后刷。我的推荐顺序是第一阶段约1周模拟题和字符串处理把日期、进制、大数加法这类高频题练透第二阶段约1周线性数据结构栈和队列的各种应用场景包括单调栈、优先队列第三阶段约1周半DFS和BFS重点练棋盘类、迷宫类、连通块类题目第四阶段剩余时间动态规划和二叉树这两个类型可以交叉进行因为递归思想是共通的。按专题刷最大的好处是你可以在短时间内反复接触同一个核心知识点把它的各种变体都看一遍。比如BFS专题刷下来你会自然总结出BFS五大件——队列、入队标记、方向数组、步数累加、边界判断到了考场上看到这类题基本不用动脑就能默写框架。3. 复盘的正确姿势用错题归因表取代无效整理3.1 传统错题本的三大误区大部分人的错题整理方式是把WA的代码复制到一个文档里旁边抄上正确题解然后……再也没有打开过第二次。这种错题本除了给自己我努力过了的心理安慰之外几乎没有任何作用。我复盘时总结出传统错题本的三个致命缺陷一是只记录结果不记录过程过两周根本想不起来当时为什么错二是没有归类动态规划题的错误和输入格式的错误混在一起统计不出自己的薄弱项三是没有回访机制抄完就完事没有安排二次重写。我自己二刷阶段试过很多种整理方式最后固定下来的是错题归因表每道错题记录五个维度题目编号、错误现象WA、TLE、RE还是CE、归因分类、复现的心智过程、以及同类题延伸。重点是归因分类这一栏它直接决定了你后续的复习方向。3.2 归因分类的详细拆解根据我的统计二刷阶段的错误原因大致可以归为五类每一类对应的解决方案完全不同读题错误没看到题目要求的输入结束标志或者看漏了按字典序输出这种限定条件。这类错误的解法是强迫自己读三遍题并养成先把输入输出格式圈出来的习惯。思路错误算法的核心逻辑有问题比如应该用BFS却用了DFS或者贪心策略不对。这类错误的解法是回到白板重新推演样例数据理解题目背后的数学结构。边界条件常见于空数组、单元素、极端值、溢出。这类错误的解法是把每个循环的边界条件逐一写下并养成构造边界测试用例的习惯。编码细节变量命名混淆、循环里把i写成j、忘记初始化、数组下标越界。这类错误的解法是通过调试器定位并且给自己立规矩提交前必须人工走查一遍代码。性能问题超时或者内存超限。这类错误的解法是重新评估复杂度把O(n^2)优化成O(n log n)或者把递归改成迭代。把错误分类之后你会看到很有趣的现象大多数人70%以上的错误集中在边界条件和编码细节这两类而这两类恰恰和算法智商没关系纯粹是熟练度和细心程度的问题。这其实是好消息——意味着只要通过规范化的刷题流程你的AC率可以稳定提升一大截。3.3 错题归因表的展示和用法下面是我实际使用的表格样式你可以直接抄走题目错误现象归因分类关键教训回访状态日期差值WA边界条件闰年二月的最后一天计算错误已重写两次迷宫最短步数TLE性能问题误用DFS导致指数级搜索已改BFS括号匹配RE编码细节栈空时访问栈顶已加判空字符串反转AC但内存大性能问题可以用双指针原地操作已优化回访状态这一列是我的杀手锏每道错题我会安排三个时间点重写——当天晚上、三天后、一周后。重写时不看之前的代码也不看题解只凭记忆和归因表里的教训从零开始写。能连续两次独立AC的题我就把它从回访队列里移除。这样操作下来每一道错题都被重复强化了三遍记忆深度远超抄一遍题解。3.4 每次复盘的输出物每次复盘结束时我会强制自己在表头上写一段本次复盘的三句话总结格式随意内容必须是自己的话。比如某次写的是这周发现我所有TLE都是因为图论题用了邻接矩阵以后一眼看到n1000就默认用链式前向星。二分查找的边界写完必须用自己构造的3个用例推演一遍。cincout同步关闭之后记得别再混用printf了。这种三句话总结是你把经验固化下来的关键也是你考前一周最有价值的复习资料——比翻错题本快多了。4. 判题规则里的隐形陷阱懂OJ机制才能少交学费4.1 从CE到AC编译和提交背后的规则很多人在OJ上栽跟头不是因为算法不对而是不懂判题系统的脾气。我在多个OJ平台上提交过代码包括学校自建OJ和杭电OJ、郑轻OJ这类公共平台踩过的编译错误大概有这些高发点头文件缺失尤其是用std::queue忘了#include queue把main函数写成void main这在GCC环境下可能能过但在部分OJ的G环境下直接CE针对性比较强的是long long和int混用时某些平台开了-Wall之后告警多虽然不CE但容易埋隐患。另外一个非常常见的坑是输入读写的格式问题。很多复试题目要求多组输入处理到文件结束也就是EOF判断。初学者最常见的是用while(cinn)这种写法时没有理解EOF的语义或者错写成了while(scanf(%d, n) 1)却把返回值判断成别的。我在郑轻OJ上见过不少提交代码本身逻辑完全正确就因为EOF判断写错了一直WA太可惜了。4.2 时间限制背后的性能估算方法复试OJ的时限一般给得比较宽松常见的1秒到3秒不等但这不代表你可以肆无忌惮地写低效代码。一个很实用的估算方法是假设评测机每秒能跑大约1e8次简单运算那么O(n^2)的算法在n10000时就到了1e8量级勉强卡线n100000时就铁定超时。所以你在设计算法时看到数据范围是10^5脑子里就要立刻拉响警报这个规模必须用O(n log n)或者更优的解法不能再写双层循环了。这个意识在二刷复盘时特别重要。因为你会发现很多首刷时AC了的题其实是用恰好卡过的方式写的比如用了过多的STL容器拷贝。二刷时我会刻意要求自己把每题的时间复杂度写出来标注在题目旁边。如果一道题的最优解是O(n)而我写出了O(n log n)我也会稍微优化一下哪怕AC了也不放过。考场上你不知道评测机的具体性能也不知道时限卡得死不死平时对自己要求高一档考场才能稳一档。4.3 一个高性价比的读取优化模板如果你还在用cin读大量数据而没关同步建议你们现在就开始用下面的模板。这个模板我已经用了很久在杭电OJ这类数据量大的题目上能有效避免无谓的TLE#include bits/stdc.h using namespace std; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); // 业务代码 return 0; }注意两点一是不要混用cin/cout和scanf/printf关闭同步后混用会导致输出顺序错乱这是很多WA的隐藏原因二是数据量极大时这招也不够用可以考虑手写快读或者直接用fread/fwrite。但对复试这个量级的题目上面这个模板足够了。4.4 内存和输出格式的坑内存限制在复试OJ通常是128MB或256MB绝大多数题目你只要不用vectorvectorint开大二维数组都不会爆。但有一个隐藏的坑递归深度。如果你用递归实现DFS而题目数据范围又偏大递归层数一深就会爆栈表现不是MLE而是RE。我二刷时遇到过一次排查了很久才发现是递归深度问题。从那以后遇到深度可能很大的搜索我默认写BFS或者显式栈。输出格式是另一个容易被忽略的丢分点。OJ判题是逐字符比对所以行末多了一个空格和少了换行都会WA。我的建议是每次提交前先看题目给的输出样例注意观察结尾有没有空格自己构造输出时可以用一个flag变量控制空格输出避免行尾空格。5. 复试上机现场和平时刷OJ的三个差异5.1 环境差异没有IDE自动补全怎么办很多同学平时刷OJ用的是VS Code加了各种插件或者用CLion自动补全和语法检查帮了大忙。但复试机房的环境常常很朴素有的学校用的是老版本的Code::Blocks甚至有的就是一个文本编辑器加命令行编译。你在这种环境下写代码平时的IDE依赖症立刻暴露结构体成员忘记、STL方法名拼错、头文件漏写这些在IDE里会被自动提示的问题现在全都变成CE或者莫名其妙的编译报错。应对方法其实很简单从二刷阶段开始有意识地每周抽出几次练习只用记事本或者极简编辑器写代码然后用命令行g编译。我第一次这样做的时候写一个二叉树的题目花了一个多小时疯狂在拼写上翻车。练了两周之后速度快了很多而且对代码的熟悉程度真的会上一个台阶。这个练习很枯燥但对复试上机来说性价比非常高。5.2 心态差异时间压力和他人进度的影响平时刷题你坐在宿舍里旁边有零食有水AC不了可以起来走两圈心态毫无波澜。考场上完全不同2小时倒计时挂在屏幕上周围全是敲键盘的声音偶尔有人提交成功那个Accepted弹出来的时候你不可能不受影响。我在模拟考场的练习中发现自己的思考效率在高压下会下降大概两三成原本轻松想到的思路现场可能要卡壳更久。所以二刷阶段我强烈建议做几次全真模拟严格按复试时间选一套难度合适的题单不许查任何资料不许中途放弃计时2小时模拟结束后再复盘。这种练习的目的不是模拟知识点而是模拟肾上腺素分泌的状态。我第一次全真模拟时三个题只AC了两个剩下那个明明平时能做出来但因为时间分配失误写到一半就慌了。练了四次之后心态明显稳了至少不会再被旁边的键盘声带乱节奏。5.3 策略差异考场上要敢于放弃平时的训练目标是每道题都弄懂考场的目标是拿到尽可能多的分数这两个目标完全不同。你需要提前想好一个重要的策略遇到卡壳的题多久之后应该跳过。我自己定的标准是一道题思考15分钟还没有明确思路立刻跳过先做后面的。等所有会的题都AC了再回头啃这道题。二刷复盘时我也反复练习了这种时间盒策略。比如限时20分钟做一道题时间一到不管进度直接看下一道最后统一回来补。这样练的好处是当你真的在考场上遇到难题时你不会因为死磕一道题而丢掉后面三道稳拿的题。这是我见过复试上机翻车最常见的死法提前练好策略能救你一命。6. 写给后来人的节奏安排和几个压箱底建议6.1 二刷开始的时间节点和每日节奏根据我自己的经验二刷开始的最佳时间是复试前4周左右。太早开始你首刷的记忆还在二刷效果打折扣太晚开始遇到薄弱专题来不及补心态会崩。4周时间正好够你按专题把核心的几类题都覆盖一遍还能留出一周做全真模拟。每天的刷题量保持在2到3道新题加1道回访旧题即可贪多嚼不烂。每道题从读题到AC加上复盘记录大概需要40分钟到一个小时每天投入2小时是合适的。这个强度既能保证进步又不至于挤压到其他复试科目英语口语、专业问答的复习时间。6.2 二刷的建议节奏分解表周次专题重点每日计划周末任务第1周模拟题、字符串处理2道新题1道回访专题总结3题限时练习第2周栈与队列、DFS/BFS2道新题1道回访全真模拟1次第3周二叉树、动态规划1道新题2道回访全真模拟1次第4周综合模拟、查漏补缺限时练习为主重点回顾错题归因表6.3 数据库存和心态调整的几句大实话最后说几句掏心窝的话。OJ二刷复盘这件事很大程度上是个熟练度游戏它不拼天赋拼的是你能不能每天稳定地坐在那边写几个小时代码。我会在刷题过程中给自己树立一个小目标比如今天二刷的题三天后重写要在十分钟内AC每完成一次那种成就感真的是看得见的。如果你在二刷中发现自己有很多题明明看过但写不出来请不要沮丧。这恰恰说明你进入了二刷的实质阶段——第一遍的记忆开始消退真正的理解和内化正在发生。这是最难受的阶段也是涨分最快的阶段。咬咬牙坚持两周你会明显感觉到代码手感回来了而且比以前更扎实。我自己在最后一次全真模拟时三个题全部AC用时一小时四十分钟从容地提前交卷。和第一次模拟时的狼狈相比中间只隔了四个星期。这八个系列的复盘见证了我从刷过但心里没底到考场上能稳住的全过程。如果我的经验能为你的复试之路提供一点参考那这篇长文就没白写。祝所有正在准备复试的你上机顺利稳稳上岸。