HackerRank 面试:两种轮次,两套相反的打法
HackerRank 不是一种面试格式,而是两种,而且它们奖励的行为几乎相反。一种由机器按隐藏测试用例打分,没有人在看。另一种由人打分,而他主要关心你能不能把自己讲清楚。按错误的那一种去准备,丢掉的分和你的能力毫无关系。
先搞清楚你收到的是哪一种
看邀请邮件。带时长、并且给你几天窗口自行开始的 Test / Assessment 链接,是自动化那一种:你独自对着计时器写代码,提交跑测试用例,没有人在场。约在具体时间、带日历邀请的 CodePair 链接,是实时那一种:共享编辑器,面试官在通话里,通常四十五到六十分钟。
如果邮件写得含糊,直接问 HR。这是完全正常的问题,而答案会改变你该怎么准备。
自动化测评到底怎么算分
你的分数是通过的隐藏用例占比,通常按题加权。由此带来几个并不显然的后果:
- 部分分是真的。一个暴力解,小数据过、大数据超时,仍然有分。什么都不提交,才是零分。永远先落地一个能跑的版本,再去优化。
- 丢分丢在隐藏用例上。空输入、只有一个元素、所有元素相同、负数、大输入下的整数溢出。大部分失分住在这里,不在算法里。
- 读输入的那段也算分。平台给的读 stdin 模板并不总是能覆盖你的边界情况,而在那里崩掉,和算法写错得到的分数一样。
- 计时通常从你打开试卷那一刻开始,不是从收到邮件开始。准备好要工作时再打开,而不是“先瞄一眼”。
一个实用顺序:先把所有题读一遍,从最有把握的那道开始,让它先通过,再往下走。回头优化是便宜的;时间用完而三道题都写了一半,不是。
CodePair 考的是另一回事
在实时那一轮,通过多少测试用例的权重,远比大多数人以为的低。面试官在填的是一张关于解决问题、沟通、以及你怎么接住提示的评分表。一个沉默地写出干净 O(n log n) 的人,分数常常低于一个把较慢的解法讲出来、自己发现它的弱点、并当着镜头改好的人。
所以策略是反过来的:复述题目,动手前先说思路,边写边讲,卡住时说出你卡在哪。沉默是这种格式里最贵的习惯,因为面试官只能给传到他那里的东西打分。
那个编辑器不是你的 IDE
HackerRank 的编辑器是刻意做得很朴素的。取决于配置,你可能没有像样的自动补全、没有语言服务、没有 import 提示、也没有调试器——只有运行和打印。平时严重依赖 IDE 的人在这里会很难受:那些平时靠补全填上的、记得半准的标准库签名,突然变成了实打实的成本。
两个便宜的防御。一是在这轮之前,用纯文本编辑器做几道题,让“没有补全”不再是意外。二是把你那门语言的核心集合 API 背熟——几乎每道题都会用到的 map、set、带比较器的排序、字符串切分。
为什么样例过了,隐藏用例却挂了
题面里的样例是用来告诉你输入格式的,它不是一套测试集,通过它几乎预测不了任何东西。隐藏用例是由一个专门去找“看起来合理的解法在哪里会崩”的人写的,而那通常就是同一份短清单:空输入、单个元素、所有元素相同、已经有序的输入、约束允许的最大规模,以及整数范围边缘的取值。
把约束条件当成隐藏用例的规格说明来读,而不是背景信息。如果题面说数组最多 10⁵ 个元素、取值最大 10⁹,它其实在告诉你两件事:平方复杂度会超时,而且把它们求和会超出 32 位整数。两件都是故意的。
每次提交之前,手动用那六种输入跑一遍自己的代码。两分钟,比任何优化都更能救回分数。
选哪门语言,会改变超时这件事
HackerRank 的时间限制是按题设的,很多出题人会给解释型语言放宽,但也有不少人不会。实际效果是:同一个正确算法,在 C++ 或 Java 里能过,在 Python 里可能纯粹因为常数因子而超时。
如果你写 Python,有两个习惯能回本:用 sys.stdin 读输入,而不是在循环里 input();以及优先用标准库而不是手写循环,因为库跑在 C 里。如果你看到很紧的时间限制配上很大的输入上界,那就是在提示你——只要你写得顺手,就换更快的语言。一个能过的 C++ 解法,胜过一个在 80% 用例上超时的优雅 Python 解法。
HR 实际收到的是什么
测评结束后,公司看到的是一份报告,而不只是一个分数:每道题的得分、哪些用例通过、你花了多久、什么时候开始和结束、包含早期尝试在内的提交历史——如果开了监考,还有一份焦点切换日志。有些套餐甚至包含代码书写过程的回放。
由此有两个推论。第一,你早早提交的那个暴力解、后来又改好了,在报告里呈现为“进展”,不是“失败”,所以尽早提交一个能跑的版本毫无代价,还能保你不至于时间用尽。第二,往一个空编辑器里一次性粘贴一整份完整解法,和稳定的敲字过程比起来,非常显眼。
如果考砸了:能重考吗,多久能再投
测评链接通常是一次性的,除非公司重新发一份邀请,否则没有重考。如果你确实遇到了可验证的技术故障,值得给 HR 写一封礼貌的邮件——他们偶尔会重发。分数是绑定在这家公司上的,在一家考砸了不会跟着你到另一家。
大多数公司在你再次投递之前有冷静期,常见是六到十二个月。这个长度足以说明:把这一次当成练习,而不是当成判决,是更健康的读法。
监考与查重,实话实说
HackerRank 提供一整套监考功能,由公司自行决定是否开启:标签页切换与焦点记录、摄像头抓拍、全屏强制,以及一套把你的提交和公开题解、其他候选人互相比对的查重系统。开没开完全取决于雇主,邀请里通常会写明。
实用的读法很简单:粘贴众所周知的题解,正是这些系统专门用来抓的东西,而被标记通常意味着在这家公司没有余地了。快速听懂题目、或者在术语上解开卡壳,和提交一份你自己解释不了的代码,是两件完全不同的事——而只有其中一件带着那种风险。
当天的清单
- 确认你收到的是哪种格式,以及时长。
- CodePair 就用有线耳机和安静的房间;两种格式都需要稳定的网络。
- 动笔之前先把所有题读一遍。
- 能跑胜过优雅——先交一个能过的,再改好它。
- 每次提交前:空输入、单元素、重复元素、极大输入。
- CodePair 里一直说话;自动测评里一直盯着表。
FAQ
HackerRank 的 Test 和 CodePair 有什么区别?
Test(或 Assessment)是自动化那一轮:你独自对着计时器和隐藏用例写代码,没有人在看。CodePair 是实时轮:共享编辑器,面试官在通话里,通常四十五到六十分钟。邀请里就能分辨——带时长和多天窗口的是自动测评,约在具体时间的日历邀请是 CodePair。
HackerRank 有部分分吗?
有。每道题的得分是通过的隐藏用例占比,所以一个小数据能过、大数据超时的暴力解仍然有分。因此先交一个能跑的版本,再去优化,永远是对的顺序。
为什么样例都过了,提交却分很低?
题面里的样例只是用来说明输入格式,不是测试集。隐藏用例专门去打边界:空输入、单个元素、全部相同、已经有序、最大规模,以及整数范围边缘。把约束条件当成隐藏用例的规格来读。
用 Python 会吃亏吗?
有可能。时间限制按题设置,出题人不一定为解释型语言放宽,同一个正确算法可能在 C++ 里过、在 Python 里超时。写 Python 时用 sys.stdin 读输入并多用标准库;看到很紧的限制配大输入,就换更快的语言。