
1. 机试Day2到底该练什么先想清楚再动手最近在准备机试的同学不少不管是考研复试的机房上机考试还是校招笔试里的编程环节“机试”这两个字总能让人心里一紧。今天这篇是机试训练第二天的复盘记录主要讲我在这一天里怎么安排环境、怎么集中练高频题型、怎么把握时间以及怎么避开那些让人原地爆炸的底层报错。写出来的目的很简单如果你也正被机试搞得焦头烂额可以直接照着这个节奏走把Day2变成真正出效果的一天。适合刚接触机试的备考者也适合想在短时间内把手感稳住的人。1.1 Day1做了什么Day2要解决什么问题第一次机试训练通常会做两件事一是把编程环境装好、把输入输出的基本用法跑通二是熟悉在线判题系统的提交流程。但很多人的Day1会在“感觉都会了”和“一提交就报错”之间反复横跳最后带着一肚子疑问结束。所以Day2的重点不是贪多而是把上一轮暴露出的基础问题一次性清掉再把几类最高频的题目类型拿出来逐个击破。我的经验是机试的题目分布其实相当固定字符串处理、模拟题、排序查找、基础动态规划/贪心这几类能占到七成以上。Day2可以围绕这些高频类型做专项训练每类只做两三道代表性的题但必须每一道都做到“能讲清楚为什么这么做”。Day2还有一个隐藏任务建立自己的做题流程。从读题、选思路、写代码、造测试用例到提交每一步都要固定下来。这套流程一旦跑顺后面的训练效率会翻倍考试时也不容易因为紧张而乱掉。1.2 Day2的目标拆解与时间分配我自己在Day2会按“环境强化、专项突破、实战模拟”三个板块来分。环境强化放在开头占一个小时左右专项突破是重头戏占两到三个小时最后留一个小时做一次完整的模拟。时间上我会这样切分时间段训练内容目标前60分钟旧题重做 输入输出细节所有Day1做过的题能不看题解重新AC中间2小时字符串/模拟/排序三类专项每类完成2-3道有代表性的题并总结套路后60分钟一次完整模拟按真实机试流程计时完成4-5道题这里要说一下为什么先把“旧题重做”放在最前面。当日志记到第二天的时候最危险的事情就是以为自己掌握了实际上一合上题解什么都写不出来。把Day1的题重新做一遍能很快找到那些“假会”的题顺便抓出一批输入输出上的坏习惯。1.3 我习惯的每日计划模板如果你是第一次按系列方式准备机试可以直接把我用的模板抄走稍微改一下就行。每天早上先花十分钟列一个清单清单里包含三件事今天要解决的旧问题、今天要练的新题型、今天要完成的模拟任务。然后用一个表格记录每道题的关键信息题号、类型、难度、用时、提交次数、卡住的点。这个表看似简单但特别有用。它会让你在Day5、Day7回看时清楚地知道自己为什么在某一类题上反复浪费时间而不是笼统地觉得“我好像不太行”。2. 环境准备与本地调试别让工具拖你后腿机试翻车的案例里有很大一部分不是因为题目不会做而是栽在环境上。平时自己在电脑上写代码和在考场的机器上写代码是两种完全不同的体验Day2如果不把环境差异补齐后面练得再多都可能白费。2.1 考场环境的适配JDK、编译器与IDE选择大部分机试系统允许的语言是C/C、Java和Python少数会支持Go或C#。我的建议是不要纠结哪个语言最好而是选你最熟、最适合机试的那个。以Java为例机试系统用的JDK版本有可能比你自己电脑上的低所以Day2就应该把本地JDK版本调到和考点一致避免因为用了新语法导致编译失败。此外IDE的选择也要提前固定下来。有的同学平时用IDEA写项目代码补全用得飞起但机试系统往往只提供Eclipse或者更基础的环境甚至只有命令行编译。建议Day2开始就用考场会提供的IDE或编辑器练习提前适应没有高级补全的环境。很多在线判题系统对代码的包名、类名都有要求比如Java主类必须命名为Main这类细节如果不提前确认考试时第一道题就会卡壳。2.2 输入输出细节决定你能不能AC机试的输入输出模块是我见过的最大的丢分点没有之一。很多人的算法思路完全正确但就是处理输入时读不到数据或者输出格式差了一个空格导致提交后是0分。在Java里经典的选择是Scanner和BufferedReader。Scanner用起来方便但从标准输入读大量数据时性能会明显变慢BufferedReader读取快但需要自己处理字符串分割。Day2应该把这两者的差异量化感受一下多写几组大批量数据的输入测试。我个人的习惯是如果题目数据量小比如只有几行就用Scanner如果涉及数组长度上万甚至更大就换BufferedReader加StringTokenizer。道理很简单机试的判题系统对运行时间有严格限制输入占用的时间也算在总时间内。很多同学自以为算法足够快结果被输入输出拖到超时这种亏我吃过不止一次。2.3 样例调试与自定义用例别只依赖题目给的数据机试题目通常会提供一两个样例很多同学看样例通过了就直接提交结果WA答案错误之后开始疯狂改代码越改越乱。正确的做法是拿到题目之后先读题再自己设计几组边界用例然后才动手写代码。边界用例的类型包括最小输入比如字符串长度为零、数组只有一个元素、最大输入数据量拉满、重复元素、全相等、倒序排列、空行等等。这些用例在Day2就要形成肌肉记忆。我自己的习惯是每道题提交前都先跑四组数据题目样例、最小边界、最大边界、一组随机数据。这四组数据过了再点提交命中率会高很多。3. 高频题型的核心拆解与实战演进Day2的专项训练我建议把精力集中投到“字符串处理”“模拟题”“排序与查找”三块。选定这些类型不是拍脑袋而是它们几乎出现在每一套机试卷子中而且一旦掌握套路得分非常稳。3.1 字符串处理出错率最高的类型套路最固定字符串题在机试里的地位极其特殊题目看着简单但实际出错率特别高。问题往往出在字符编码、大小写、空格、分隔符、子串边界这些细节上。举一个很常见的例子统计一行字符串中每个字符出现的次数。看起来只需遍历一遍但如果你用Java的String.charAt()去取字符再对ASCII码做数组下标一切没问题如果字符串里混入了中文字符字符编码就会让结果错得莫名其妙。Day2练这类题时要有意识地构建一套“固定处理流程”先把字符串转成字符数组再统一大小写再决定是否忽略空格和标点最后才做统计。再比如判断回文串人类一眼就能看出来的东西代码里却需要你仔细处理偶数长度和奇数长度两种情况。建议在Day2把这类问题归纳成一个清单字符串反转、分割、子串、模式匹配、字符统计、格式化输出每个小类刷一遍形成条件反射。3.2 模拟题不是不会写是想不到边界模拟题在机试里的占比相当高也是最考耐心的类型。“模拟”两个字听起来简单就是按照题目描述的规则一步步执行但难点在于规则可能有十几条而且环环相扣。以日期计算为例给你一个日期要求计算它是这一年的第几天。这道题的重点在于闰年判断和月份的累积天数。很多人写之前不列框架直接上手写到三月以后就晕了。我的方法是先写一个辅助函数isLeapYear()再建一个月份天数数组最后统一计算。当题目要求“从某年某月某日到某年某月某日共经过多少天”时还要考虑年份跨越、起始日是否计入等约定Day2就需要把这类边界全部整理清楚。模拟题其实是训练代码框架能力最好的素材。它不需要太复杂的算法但要求你把逻辑拆成清晰的小函数而不是堆一个几百行的main函数。Day2我做模拟题时会强制自己“一个功能一个函数”比如日期计算就拆成读输入、判断闰年、计算天数、格式化输出四个部分这样排错时会非常舒服。3.3 排序与查找从会用函数到理解边界很多机试允许直接调用排序函数这是好事但只看表面的人会在题目稍作变形时翻车。比如让你按“字符串长度、再按字典序”排序或者让你找第K大的数如果你只会调用现成排序API处理起来就会很被动。Day2建议把排序和查找里最核心的几种场景过一遍自定义比较器排序、稳定排序、归并排序求逆序数、二分查找的边界条件。二分查找是重灾区很多人背了模板但不知道什么时候用left right什么时候用left right导致死循环或越界。我练二分查找时有一个心得不要背模板要自己推一遍。把数组画出来手动模拟指针移动的过程理解为什么mid要这么取、为什么left和 right的更新方式不同。这样哪怕题目换了问法比如查找第一个大于等于目标值的位置、查找最后一个等于目标值的位置你也能很快写出正确的版本而不是靠试出来的。4. 时间分配与抢分策略机试不只是拼算法有很多算法水平不错的同学在机试里照样考砸原因只有一个时间分配出了大问题。机试的时间一般在一个半到三个小时之间题目量从三四道到七八道都有。如果你把前两道简单题花掉太多时间后面拿大分的题目就只能眼睁睁放弃。4.1 题目难易分布与做题顺序我的建议是不要按题号顺序做题要先花三分钟把所有题目快速扫一遍。先看每道题的输入输出规模和题目类型用十秒钟判断它是“送分题”“中等题”还是“压轴题”。做题顺序应该是“先能拿分的再难啃的”。优先把最有把握的题搞定保证一个AC到手然后处理那些有思路但需要点时间的中等题最后剩余时间再攻难题。机试系统通常按通过测试点的比例给分也就是说你做出部分测试点也能拿到分数。所以千万不要在一道题上死磕超过四十分钟那不是执着是浪费。这里我可以给出一个大致的参考时间如果三个小时做五道题前两道简单题各控制在25分钟以内中间两道中等题各40分钟最后一道难题最多留40分钟。如果到时间还没有完整思路果断放弃写暴力解法拿部分分都比空着强。4.2 暴力解法是可靠的保底武器很多备考者有一种错误心态觉得暴力解法丢人非要用最优解不可。但在机试里能AC的代码就是好代码。限时压力下先写一个能跑出正确答案的暴力版本再去优化是极其高效的策略。举个例子如果题目要求在一堆数里找满足条件的组合最直接的办法就是多层循环枚举所有情况。当数据量很小时这种O(n³)的代码完全可以通过所有测试点。当你先拿到这个基础版本后再根据时间决定是否改成更优的算法。这比一上来就憋一个复杂的双指针或动态规划要稳得多因为最优解法一旦写错你可能连调试的思路都找不到。暴力解法还有一个额外作用可以用它来验证优化方案是否正确。写一个暴力版和一个优化版跑随机数据对比结果如果一致再把暴力版注释掉交优化版几乎不会出错。这个习惯我在Day2就开始刻意培养。4.3 如何快速验证一遍正确性提交前验证代码正确性应该有一套固定动作。我自己的顺序是这样的第一步跑题目的样例确认输出完全一致第二步跑自己造的边界用例重点看数组越界、空输入、重复数据这些极端情况第三步随机生成一组中等规模的数据把结果和暴力版本对照第四步检查输出格式包括空格、换行、小数点位数。这套动作做完通常只需要五到八分钟但它能拦住至少一半的无效提交。很多同学提交后WA然后靠一遍遍“提交-失败-修改”来碰答案这不仅浪费时间还会把手感越搞越差。Day2如果能把“提交前验证”变成习惯后面每天的训练质量都会不一样。5. 高频报错与运行陷阱排查实录Day2训练过程中一定会遇到各种报错这里我把最有代表性的几类整理出来并附上我自己排查时的思路。这些内容看起来零碎但确实是机试里最消耗时间的地方。5.1 编译错误最容易忽视的坑编译错误是新手最常遇到也最让人烦躁的问题。Java里常见的有类名没写成Main、缺少import、大小写写错、括号不匹配、使用不存在的变量、变量名拼写不一致等。有一类特别隐蔽的错误是主类里写了package语句在线判题系统不允许这种操作结果本地运行没问题一提交就编译失败。避免编译错误的方案有两个一是在本地使用与考场一致的JDK版本和编译器配置二是养成“关键语法不凭记忆写完后整体扫一遍”的习惯。我见过有些同学喜欢写完代码立刻提交然后把判题系统当编译器用这绝对是大忌。判题系统只会告诉你编译错误不会告诉你错误在第几行写得多么清楚你应该在本地先把这些信息拿到。5.2 运行错误数组越界、空指针与除以零运行错误RE是最考验耐心的一类报错。数组越界、空指针、栈溢出、除以零这些都可能导致程序中途崩溃。以Java为例最容易出现的几种情况是用字符串长度做数组下标时没有考虑空字符串、递归没有设置出口导致栈溢出、整数相除时被除数为零。我的排查经验是先把所有可能越界的循环列出来逐个检查边界条件再检查所有可能为null的对象引用最后看有没有隐式的数学运算风险。很多时候运行错误不是算法思路问题而是某个细节忘了处理。Day2训练时我建议你准备好一个“检查清单”每次报RE就按清单逐项排查比自己像无头苍蝇一样乱试要快得多。5.3 超时问题复杂度意识与剪枝思路超时TLE是机试里最让人绝望的报错。明明结果是对的就是跑不完。解决超时的核心是具备复杂度意识。一般来说1秒钟的时间窗口大约能执行10的7到8次方次基本操作。如果题目给的数组长度是10的5次方你就不能写O(n²)的解法如果长度是10的3次方O(n²)一般没问题O(n³)就可能卡时间。如果确认算法复杂度没问题但还是超时就要检查是不是输入输出拖慢了速度或者代码里有大量无意义的重复计算。剪枝也是一个思路比如DFS搜索类题目可以通过判断当前路径是否可能超过最优解来提前终止。Day2遇到超时时先不要慌按“复杂度理论→输入输出→冗余计算→剪枝”的顺序排查大概率能找出问题。6. 从模拟训练到真实机试考场细节与心态调整Day2除了刷题和排查问题之外还应该抽一点时间思考“考场上会怎样”。这听起来很虚但实际上特别关键。机试不只是考你会不会写代码还考你有没有能力在高压环境下稳定输出。6.1 模拟环境与真实机试的环境差异环境差异主要包括几个方面屏幕尺寸和分辨率、输入法状态、IDE皮肤、键盘手感、网络延迟。这些不起眼的差异都可能影响你的发挥。我的建议是Day2开始每隔一天就找一套完整的模拟题严格按照真实考试的时间和环境来练习。环境模拟还有一层含义是“断网练习”。很多同学平时一遇到编译错误就上网搜索考场上没有这个条件心理压力会骤增。所以从Day2开始我建议你有意识地减少训练时查资料的次数哪怕写错了也要强迫自己先看错误信息自己找原因。这个过程会痛苦但它能显著提升你独立解决问题的能力。6.2 做题节奏失控的处理方法考场上最容易出现的情况是某一道题卡了二十分钟还没思路这时候心里开始发慌看其他题目也觉得不会做最后整场考试都崩了。针对这种情况我在Day2训练时专门给自己定了一条规则一道题如果在十五分钟内没有任何有效进展立刻停笔换下一道。这里说的“有效进展”指的是能想到一种可行方案、写了部分代码、或者已经能确定某个关键细节。如果你十五分钟了还只是反复读题、纠结用什么算法那就说明这道题很可能超出了你的当前水平。先放下它把其他能拿的分全拿到再回头处理它。机试的记分是按点给分一道难题只影响一部分分数但心态崩了会影响整场考试。6.3 机试当天的清单与习惯最后整理一份我每次机试前都会过一遍的清单供大家参考。出发前检查证件和必要物品进入考场后先调整好键盘位置、屏幕亮度和IDE字体大小打开题目后先花三分钟扫完全部题目做题时按“先易后难、先拿稳分”的顺序执行每道题提交前跑一遍样例和边界用例全程留意剩余时间至少留出十分钟做最后检查。Day2说到底是一个承上启下的节点。它要消化Day1遗留的问题也要为后续几天的高强度训练打底。我个人的体会是这一天最重要的不是题目刷得多而是你真正开始以考试的标准要求自己无论是环境、时间、排查问题的方式还是心态上的自我调节。把这些先跑通后面的机试训练才会越走越顺考场上那台陌生的电脑也就吓不住你了。