☰
东华复试OJ二刷复盘:从记忆性AC到理解性AC的实战指南
2026/10/3 2:56:39 网站建设 项目流程

先说结论:东华复试OJ的二刷,绝不只是把所有题再做一遍那么简单。真正拉开差距的,是你在第二次接触同一道题时,能不能用比第一次更短的时间写出更稳的代码,能不能在考场那种紧张环境下,把曾经AC过的思路瞬间变成手下的键盘声。这篇复盘8是我的系列第8篇,前面记录了踩坑、刷题节奏、重点题型,这次想专门聊聊二刷这件事本身——它和首刷的差别、复盘的具体方法、以及那些藏在OJ判题规则里的隐形陷阱。

很多人初试分数不错,结果复试上机一塌糊涂。原因往往只有一个:把OJ刷题理解成了"看题解、抄代码、AC了就往下走"。这个流程应付初试的笔试还行,但在复试上机这种"白纸写代码、错了当场掉分"的场景里,根本扛不住。我二刷阶段最大的体悟是:OJ刷题的核心不是"做过",而是"能在限时场景下独立做对";复盘的产出也不是一份错题文档,而是一套自己能快速调用的解题模板和边界条件清单。

写这篇复盘时,我又把过去几周的刷题记录、错题归因表、以及考场环境中容易翻车的细节全部过了一遍,尽量把对后来人有用的内容拧干水分,直接给你能用的东西。如果你也在准备研究生复试的上机考试,这篇文章应该能帮你少走不少弯路。

1. 二刷到底在刷什么:从"记忆性AC"到"理解性AC"

1.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都是因为图论题用了邻接矩阵,以后一眼看到n>1000就默认用链式前向星。""二分查找的边界,写完必须用自己构造的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(cin>>n)这种写法时,没有理解EOF的语义,或者错写成了while(scanf("%d", &n) == 1)却把返回值判断成别的。我在郑轻OJ上见过不少提交,代码本身逻辑完全正确,就因为EOF判断写错了一直WA,太可惜了。

4.2 时间限制背后的性能估算方法

复试OJ的时限一般给得比较宽松,常见的1秒到3秒不等,但这不代表你可以肆无忌惮地写低效代码。一个很实用的估算方法是:假设评测机每秒能跑大约1e8次简单运算,那么O(n^2)的算法在n=10000时就到了1e8量级,勉强卡线;n=100000时就铁定超时。所以你在设计算法时,看到数据范围是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,绝大多数题目你只要不用vector<vector<int>>开大二维数组,都不会爆。但有一个隐藏的坑:递归深度。如果你用递归实现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,用时一小时四十分钟,从容地提前交卷。和第一次模拟时的狼狈相比,中间只隔了四个星期。这八个系列的复盘,见证了我从"刷过但心里没底"到"考场上能稳住"的全过程。如果我的经验能为你的复试之路提供一点参考,那这篇长文就没白写。

祝所有正在准备复试的你,上机顺利,稳稳上岸。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询