尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

东华复试OJ 85-87题复盘:数组统计、双指针与递推的边界控制

发布时间:2026/9/15 21:57:30

资讯中心
01
ARTICLE

东华复试OJ 85-87题复盘:数组统计、双指针与递推的边界控制

东华复试OJ 85-87题复盘:数组统计、双指针与递推的边界控制
复试机试没有捷径但每天三道题打卡这件事是我整个备考周期里坚持得最踏实的习惯。东华复试OJ的题号越往后做越有意思85到87这三题正好覆盖了“数据范围边界”“双指针思维”“递推状态设计”这几个高频考点。今天这篇就把这三道题的复盘完整记录下来复盘过程中我会还原当时的思考链路、踩过的坑以及为什么这么写能过、那么写就超时希望能给同样在备战东华复试机试的朋友一些参考。先说下这段时间刷题的一个整体感受。复试OJ不像竞赛OJ那样追求极致的算法技巧它更看重的是你能不能把题意读懂、把边界条件处理干净、把基础数据结构用得顺手。所以这个阶段的每日3题我不再追求题量而是开始刻意复盘每道题的“陷阱点”。85~87这三题做完最大的收获就是很多看似简单的题丢分全丢在细节上而不是算法本身。1. 这一阶段的做题思路与复盘方法1.1 为什么把打卡题量定在每天3道备考东华复试那段时间白天要兼顾毕业设计和英语口语能整块用来刷题的时间并不多。我把目标定为每天只做3道题并且必须完成“做题、提交、复盘”三个完整步骤。一天3道题看起来不多但复习周期拉长之后题量积累也相当可观更重要的是能保证每道题都吃透。复盘方式我也摸索过几轮。最开始是做完就扔第二天啥也不记得后来改成每道题写完直接看题解结果自己做对的题也懒得深究遇到不会的题看两眼就丢。真正有效的是“先独立AC、再翻记录、最后写复盘笔记”这套流程。每一道题都要想清楚三个问题第一这道题考的核心知识点是什么第二我的第一版提交为什么错第三有没有比当前写法更简洁或更稳的实现方式。1.2 东华OJ题目分布的一些规律刷到80题之后我对东华OJ的出题风格也有了大致的判断。这套题并不是单纯按难度线性递增的而是会在一段时间内集中练习某个专题。比如前面的题大量涉及结构体排序中段开始出现矩阵操作和字符串处理到了85~87这几题又开始回归到最基础的数组处理和递推问题。这个阶段有个很重要的备考策略不要跳过看起来简单的题。我见过很多人在OJ刷题时会专挑难题做觉得简单题没意思。但东华复试OJ这类面向考研的评测系统恰恰是靠简单题来筛“细节处理能力”的。85题、86题、87题单看都不难但每一道都埋着典型的ACM式陷阱——比如多组输入、EOF结束、四舍五入、数据范围、输出格式。这些恰恰是在真实考场上最容易让人卡住的地方。2. 第85题复盘数组统计与多组输入的处理2.1 题目大概长什么样这道题我记忆中的题面比较直接大意是输入若干行数据每一行代表一次测试要求统计某个分数段的人数或者某种特征值的出现次数。从题号位置和考察习惯来看应该属于“数组应用输入输出控制”的经典题。这类题在OJ上的难度评级通常不高但特别能检验基本功。我当时分析这道题时先确认了三个关键点输入终止条件是什么、数据范围有多大、输出格式有没有特殊要求。很多人在做这类题时根本不看数据范围直接用固定大小的数组存一旦输入规模超过预期就会出现段错误。这种错误在本地运行时未必能复现提交到OJ上直接就是RE或WA。2.2 核心解法与代码实现以统计一系列整数中各个分数段人数为例核心思路其实很简单用一个长度为区间上限的计数数组对每个输入数字执行cnt[x]最后按区间累加输出。这里最需要注意的地方有两个一个是数组是否足够大另一个是输入循环的终止条件。我当时用的写法大概是这样的C语言版本#include stdio.h #include string.h int cnt[1000005]; int main() { int t, n, i, x; scanf(%d, t); while (t--) { memset(cnt, 0, sizeof(cnt)); scanf(%d, n); for (i 0; i n; i) { scanf(%d, x); cnt[x]; } // 按题目要求遍历统计区间并输出 for (i 0; i 1000000; i) { if (cnt[i]) { printf(%d %d\n, i, cnt[i]); } } } return 0; }我自己在写这道题的时候其实第一版提交就栽在了memset上。因为是多组输入每组数据都要把计数数组重新清零我当时图省事只重置了用到的部分结果下一组数据进来时把上一组残留值也统计进去了。后来改成每次循环都完整重置问题立刻消失。这个细节看起来小但在OJ评测里就是最典型的WA来源。2.3 这道题的复盘心得第85题值得记住的点O(n)的复杂度通常都不会超时但你要搞清楚n的量级是多少。如果n是10的6次方以上循环里就别做多余的事情。另外多组输入的题目一定要搞清楚什么时候结束——是读到文件末尾EOF还是先读一个组数t。很多OJ题目习惯用EOF作为结束标志如果你按照“先读t再循环t次”的逻辑去写遇到没有t的输入格式就会一直卡在第一个scanf上表现出来就是超时或者输出错乱。当时为了验证自己的输入处理是否正确我用了一个小技巧先在本地构造好样例输入文件用命令行重定向跑一遍观察输出和预期是否一致。复试备考期间每一道OJ题都建议这样做因为本地编译器不报错不代表OJ上就能过格式问题只有在评测时才暴露。3. 第86题复盘双循环与边界条件的控制3.1 题目背景与我的第一反应第86题做的时候结合题号与题目风格推测应该又是字符串或者数组操作的题目。这类题通常给定一个字符串或整数序列让你做某种“平移”“删除”“反转”之类的操作。当时我看到题目的第一反应就是直接模拟但转念一想会不会存在更高效的解法。果然写着写着就发现这道题真正考察的是“双指针”思想——一个指针从头往后走一个指针从后往前走两个指针在中间汇合时结束循环。这类操作在字符串反转、区间交换、特定元素移动中非常常见。如果你没有双指针的思维习惯用两层循环暴力扫数据一大就很容易超时。3.2 双指针解法的实现细节以字符串反转或字符替换为例核心代码可以写成这样#include stdio.h #include string.h void reverse_str(char *s) { int left 0, right strlen(s) - 1; while (left right) { char tmp s[left]; s[left] s[right]; s[right] tmp; left; right--; } } int main() { char s[1005]; while (gets(s)) { reverse_str(s); printf(%s\n, s); } return 0; }这里要特别注意while (left right)这个条件它保证了奇数长度和偶数长度的字符串都能正确处理不会出现重复交换或越界访问。我在做这道题时第一版就是用了while (left right)导致中间那个字符被交换了两次结果虽然反转后看起来一样但在某些需要统计交换次数的变种题里就会出错。另一个容易踩坑的点是gets函数。现在很多OJ的后台编译器已经把gets标记为不安全函数东华OJ的评测环境我不确定具体版本但从稳定性考虑建议用fgets再手动去掉末尾的换行符。否则字符串比预期多一个\n处理边界时会非常麻烦。3.3 从这道题延伸出的预备知识这道题做完以后我顺手把“双指针”的常见变体都过了一遍包括快慢指针找中点、左右指针求两数之和、滑动窗口维护区间信息。这些内容在复试机试中出现的概率很高而且一旦掌握套路写起来非常快。我建议备考的同学不要只满足于AC这道题而是把这道题背后牵出的“双指针技术”整个链路都打通这样遇到同类型题目就能举一反三。真题里还有一类变形是“删除有序数组中的重复项”思路也是双指针。一个指针负责遍历原数组另一个指针维护最后有效位置。每次遍历发现新的值就把它放到有效位置的下一格。这类不需要真正删除元素、只需要逻辑上整理数组的技巧在复试OJ里非常受欢迎因为既考察链表/数组操作的基本功又考察处理边界条件的能力。4. 第87题复盘递推思想的典型应用4.1 从题目猜到的考点第87题我印象里是典型的递推题大概率和斐波那契数列或路径计数有关。比如“上楼梯每次可以走1阶或2阶问到达第n阶有多少种走法”这种经典模型。这类题的代码量通常很小核心就是一个递推方程dp[i] dp[i - 1] dp[i - 2]难点不在于递推式本身而在于两点第一初始条件怎么定第二数据范围大到什么程度、需不需要用大数处理。4.2 递推实现的注意点以最典型的“爬楼梯”为例代码可以写成#include stdio.h long long dp[1005]; int main() { int n, i; while (scanf(%d, n) ! EOF) { dp[0] 1; dp[1] 1; for (i 2; i n; i) { dp[i] dp[i - 1] dp[i - 2]; } printf(%lld\n, dp[n]); } return 0; }当时我提交这道题时踩了一个非常典型的坑变量类型没选对。题目如果只到n30用int完全没问题但复试OJ有时候会把数据范围悄悄放大。我第一次用int定义dp数组本地测试小数据全部正确一提交到OJ就是WA查了半天才发现是数据溢出。换成long long之后问题立刻解决。这件事给了一个重要提醒做题之前先瞄一眼数据范围别凭感觉选类型。复试机试不会像ACM那样专门刁难你但数据范围若是刚好越过了int的上限这就成了区分考生的拉分题。4.3 递推类题目的复盘框架现在我做递推类题目会严格按四步走第一步定义状态明确dp[i]到底代表什么含义。第二步写转移方程这一步是整个递推的核心必须想清楚当前状态可以由哪些之前的状态转移过来。第三步确定初始条件和边界没有合理的初始条件递推结果全错没有边界处理数组越界WA。第四步考虑优化空间二维递推能不能压缩成一维一维能不能只用几个变量滚动更新。第87题本身只需要一维递推但我复盘时特意多想了“如果题目变形成二维迷宫路径计数该怎么办”。这样的延伸思考让我在后面遇到类似的题时完全不慌因为状态转移和边界处理的思路是通用的。5. 实战中常见的错误与排查技巧5.1 输入输出格式问题这段时间刷题下来 最让人头疼的不是算法不会而是输出格式不对。尤其在东华OJ这类面向复试的评测系统里输出格式错误会直接判WA。常见的格式问题包括多打了空格、少打了换行、printf中用了中文字符的冒号、每个输出之间缺少空行、最后一行输出了多余的空格等等。我的习惯是写完代码后不着急提交先在本地用题目给的样例测试然后把输出结果复制到文本对比工具里和标准输出逐字符对比。肉眼看不出来的时候用diff命令在Linux终端里对比最可靠。Windows环境下也可以用Beyond Compare等工具总之不能只看“看起来差不多”就提交。5.2 数组越界与段错误段错误Runtime Error即RE错误在OJ上非常常见。大部分时候都是因为数组开小了或者访问了下标越界的元素。东华复试OJ的题目数据一般比较温和数组大小超出最大可能输入量一点点就够。但如果是多组输入共用一个全局数组一定要记得清空数组或只用到哪清到哪。出现RE时最有效的排查方式是在本地编译时加上调试选项比如gcc -g然后用gdb定位崩溃位置。如果没时间学gdb就在关键操作前后加printf输出标记二分定位到崩溃行。复试阶段时间宝贵不推荐在调试工具上花太多时间凭经验快速锁定数组和指针问题一般都能很快解决。5.3 死循环与超时排查如果代码在OJ上显示TLE超时通常有三种可能一是算法复杂度太高需要换思路二是某个循环条件写错导致死循环三是输入处理方式不对一直在等待输入。第三种情况最容易迷惑人因为本地运行时如果你手动输入数据程序表现得完全正常但OJ评测时你的程序跑完了输入数据进程却还在等待新的输入自然就超时了。排查方法很简单检查你的循环终止条件是不是依赖一个根本不会被满足的scanf返回值。正确写法是对于“读到文件末尾结束”的题目用while (scanf(...) ! EOF)或者while (cin n)来判断。5.4 常见问题速查表为了方便复盘我自己整理了一个简单的问题对照表刷题时遇到类似错误可以快速定位原因错误类型可能原因验证方式WA数据范围溢出、边界条件错误、格式问题构造边界样例、检查输出字符RE数组越界、野指针、除零缩小数据范围二分定位检查数组容量TLE算法复杂度过高、死循环本地测大样例耗时检查循环终止条件PE输出空格或空行不符合要求与标准输出逐字符比对CE语法错误或使用被禁用函数查看编译器报错信息东华复试OJ的反馈通常不会给具体原因只会告诉你是哪种错误所以快速排查的能力本身就是备考的一部分。遇到WA时不要急着怀疑评测系统而要先怀疑自己的边界条件和输出格式。6. 打卡节奏管理与临场心态调整6.1 如何保持每日3题的习惯坚持打卡这件事难点从来不在题目本身而在“持续”二字。我的经验是把刷题时间固定下来比如每天下午三点到五点雷打不动坐在电脑前。哪怕某天状态不好只AC了一题也要打开OJ把代码写完并提交。一旦连续断了两天再捡起来就需要很大动力。我也试过在手机上用备忘录记录每日打卡情况后来发现还是用表格管理最清晰。每一行列一个日期记录当天完成的题号、各题AC状态、错误原因、复盘要点。这个表格在我复试前最后一周复习时帮了大忙我只需要翻看表格里的“复盘要点”列就能快速回忆起每一道题的坑在哪里。6.2 遇到难题卡住时的应对策略每天3题里偶尔会有一道题卡很久。我的处理原则是先独立思考半小时如果半小时还没有思路就标记为不会看题解后重新自己写一遍。注意这里“重新自己写一遍”很关键。只看题解不敲代码等于没看。只有亲手把题解里的思路转换成代码并AC这道题才是真会了。另外不必因为某道题卡住就自责。复试机试的目的是筛选能够解决实际问题的人而不是选拔竞赛选手。遇到不会的题及时止损、总结规律、积累经验比死磕一道题更有价值。6.3 考场上和平时练习的区别平时刷OJ你可以慢慢想、反复试、不断提交。真正复试时环境压力完全不同所以日常练习要尽量模拟考场状态。我通常会把每日3题看成一场小型模拟考从读题到AC尽量控制在15到20分钟内。如果一道题超过这个时间就说明知识点掌握得还不够熟练需要回看错题笔记。考试时最重要的是先把所有题目都读一遍按照从易到难的顺序做题。先把能拿的分稳稳拿到手再回头啃难题。如果一道题提交后WA冷静看看是不是输出格式的问题别死磕算法思路很多时候恰恰是一个空格的问题。7. 一些更长期的刷题扩展方向7.1 从东华OJ过渡到其他OJ平台如果你东华OJ刷到一定题量之后觉得游刃有余可以适当扩展去其他在线评测平台练手。不同OJ的出题风格差异很大有的侧重思维有的侧重数据结构和基础算法。多接触不同风格的题目能帮你建立更全面的解题能力。不过要注意复试准备终归要以目标院校的OJ为主。扩展练习可以放在复试笔试结束到上机考试之间的空档期千万不要本末倒置拟真训练时还是以东华的题目风格和难度为准。7.2 把刷题笔记整理成自己的错题本这些天下来我的错题本已经积累了厚厚一叠。每道错题都包含了题目链接、错误原因、正确思路、代码片段四个部分。复试前一周我没有再大规模刷新题而是反复翻看错题本把每一道题的教训都过了一遍。这个习惯被我视为整个刷题阶段价值最大的部分。整理错题本的时候不要太追求格式美观自己能看懂就行。我当时用的就是一个纯文本文件按题号顺序记录用分隔线把每天的复盘隔开。东华OJ的题号是连续的这样记录后期检索起来特别方便。7.3 做题之外的小建议备考复试机试这段时间我也总结了一些做题之外的心得。第一键盘操作要熟练除代码外也要熟悉IDE的调试快捷键减少无谓的时间浪费。第二注意休息长期刷题会导致思维迟钝效率下降反而得不偿失。第三尽量每天保持一定的代码量哪怕不刷OJ自己写点小工具也能维持手感。像东华这类高校的复试OJ考察的从来不是“你会不会某个冷门算法”而是“在有限时间压力下你能不能把一道常规问题干净利落地解决”。这个能力没有捷径只能靠日复一日的练习和复盘去打磨。我自己在刷完85~87这几天后的一个明显变化是面对一道新题不再着急写代码而是先花一两分钟想清楚输入的边界、数据的大小、输出的格式然后再动手。这个习惯让我后续做题的AC率提升了不少。最后再分享一个小技巧——每道题AC之后试着把代码里的变量名改得更有意义一点再重新写一遍这个过程非常能检验你是真的理解了代码还是只是“碰巧”让它跑通了。
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。