因为大部分面试者都很水啊。我们想用一个比较简洁、省力的方法筛选好的候选人。在面试中,区分度是最重要的。
这个问题让我想起了早期在美国求职被拒的经历。
当时一个不修边幅的亚裔小哥哥(一看就感觉像 nerd)问了我这么一道题:
reverse a linked-list using by using a iterative way
我当时还非常稚嫩,非常生气,想着出这种题的 point 在哪里?还想着和面试官 argue 一下。后来的结果可想而知。
首先我们来看一下这道题,如果用最简单的 recursion 来做,差不多是这样
// pseudo code
function reverse(root, newHead){
if(!root){
return newHead;
}
next = root.next;
root.next = newHead;
return reverse(next, root);
}
然后来分析一下时间复杂度,和空间复杂度。
因为只可能遍历所有 n 个节点,所以 time complexity 为 O(n)。
因为 recursion stack call,这里会调用 n 次,所以 space complexity 为 O(n)。
那么有没有更好的解法呢?
// pseudo code
function reverse(root, newHead){
newHead = null;
while(root){
next = root.next;
root.next = newHead;
newHead = root;
root = next;
}
}
这么解就会好很多,因为没有 recursion stack call,所以 space complexity 为 O(1) 即常数。算是非常大的提升了。
就这么简单的一道题,基本上有 2-3 个区分度。
1)会不会基本的 CS 基础。
2)会不会准确的说出时间/空间复杂度。
3)会不会优化。
所以你看我当时连基本的第 1 个度都没达到,可不就挂掉了呢。
最后我想说,在我目前的工作中还真用到不少 recursion 等相关 CS 基础内容。那些说『面试造火箭,工作拧螺丝』的大概是没有想去探索真正附有挑战的工作吧。
只有自己不断地去探索、不断去超越自己才有可能一直进步。