刚刚在 CodeSignal 上做了 OA,结果很不好,一题超时,想不出更优的解法,分数很低。
我认为那道题只能有 n^2 的解法,两个 Array 都要遍历一遍,我用了 n^2 的算法加上剪枝,过了一些样例,超时了其余的。很大可能是 C++ 给了更严格的时间限制。
但是,
我想说的不是这道题的解法,而是这个平台。
我遇到了一个很奇怪的bug,在判断两个 int 类型的数大小时
int a = 1, b = -1;
if (a < b)
cout << "a < b is true" << endl;
// a < b is true
或者
int a = 2, b = INT_MIN;
cout << (a < b) << endl;
// 1
他会出现这样的bug。我不知道其他情况是什么返回,时间有限没有测试,但是只要第二个数是负数,每次运行的第一次肯定返回错误的答案。
这样的调试,花了较长的时间。因为在 oa 时,我只能一行一行代码 cout 调试。我以为是哪里的逻辑出了问题,直到 cout 到这个地方,才发现。
CodeSignal 这个平台很怪,他出题的难度很奇葩,不同时间,不同人做题,出现的题难度有非常大的差别。运气好的时候,遇到很简单的题,运气不好的时候,遇到很难的题。这些都很正常。但是他会限制你做题的次数,每 15 天只能做一次。这两个情况单独哪个出现都很合理,但是两个一起来,就很不合理。如果你瞎出题,那 15 天做一次,运气成分就占了绝大多数了。过了简历初晒,我认为自己已经过了最基本的运气筛人了。你在这个步骤搞运气,随机踢掉一些应聘者,真缺德。
而且,这个测试根本没能测试出代码能力。前两道题忘记是什么了,反正不涉及到算法。 OA,就考察 for 循环能力吗?至少来个 DP,Greedy, 图论的考题吧?我记得第三题用了 BFS 的变形,算是唯一能拿得上台面的题了,除非第四题有比 n^2 更快的解法,但是理论上不可能。不能 DP 不能贪心的题,总要把所有情况 search 一遍,剪枝。