经历过的最有挑战的面试了,不管结果如何,都是一段值得珍藏的经历。
本来把人搜当酱油的,面试如此,笔试亦然。刚开始找工作时,看见论坛内推人搜,果断投简历,结果连面试机会都没有,觉得这个公司要求高,自己太菜。两周前去人搜参观,邓亚萍的演说没什么印象了,首席科学家刘骏让我崇拜得一塌糊涂,具有的知识体系、所站的高度、大将风度、大智慧,能有这样近距离聆听交流的机会,是一种幸运。前天,收到人搜的面试通知,某人让我抛弃酱油想法,从思想上重视,全力拿下,看着那认真劲,我从了,昨天去面试前上午9点多又给我送来早饭和鼓励。本来下午一点的面试,于是没吃午饭直接过去了,等到了14:45左右才进入面试室开始面试,三面面试官离开时,看了下表,19:15,用过公司提供的晚餐后回来。
一面,年轻技术男。写了4道算法题。
1、实现函数:char** Func(char* origin),对输入字符串,返回分割符(空格、回车、\t)分割的字符串数组,注意考虑所有边界情况。
写了可能十分钟左右,用了递归,比较顺利搞定。
2、普通二分查找:int Binary_Search(int[] a, int res, int n);
这个题没啥说的,几分钟写完,没出什么错。
3、在第二题基础上,对升序排列的数组a,假定数组元素都大于0,在数列的任意位置插入任意多个的0(去0后仍为升序),修改上一题代码,完成二分查找。
这个也不难,就是要注意特例情况,比如半个序列都是0的情况等。
4、给定一个矩阵m*n,求最大子矩阵和。
这是个经典题吧,OJ上有,可惜自己还是没太想明白,于是跟面试官说一维的情况我会,于是把一维的情况讲清楚,然后在面试官引导下,算把这个题解决了。最后只让我写了一维情况的代码,比较顺利。
14:50-15:35,四个程序题,貌似写得还不算太慢,45分钟一面结束。
然后是原地漫长而痛苦的等待,又饿又困,真感觉自己快撑不住了。
16:25左右,二面开始,年轻技术男,四个算法题。
1、给定一个数组,找出每个数之前比他大的第一个数,要求O(n)时间。
这个题当时只想出了比暴力好的方法,没达到O(n),面试官没给太多时间,就换下一题了。
后记:论坛求解后,发现单调队列能很好解决这道题
2、大数据量问题。有100万个URL,每个URL看出是字符串,长度小于100,要求所有URL的最长公共子串。
这个题我把快排、后缀树、字典树、bitmap……各种我会一点又不精的数据结构知识都用上了,说了好多思路,最终也没有达成面试官最满意的解法。
3、一棵二叉树,给定任意两个节点,求出他们的第一个公共父节点。
这个用递归思路,写得磕磕碰碰,感觉不是最优,但是写出来了,代码比较乱,功能是实现了。
4、字符串a,b,判断b是否为a的子串,子串定义为b可以由a删除任意多个字符形成,如a:abcff,b:bf,b为a的子串。
说了一个动归的类似于动归的解法。
4.5、在第三题基础上,判断从a变为b有几种删除方法。
这个比较纠结,说了很长时间,最后让写伪代码。写得不太理想。
16:25-17:40,这面稍微长些,主要是确实问得比较深点,纠结很久。其中,不得不提,启明的HR好执着,给我打了8个电话,一直在震动,我又不好意思去按掉,弄得好尴尬。然后又是不那么漫长的等待。
18:00左右,三面开始,年轻技术男,四个算法题。
1、判断两个链表是否有交点,要求考虑链表有环无环的所有情况。
这个算是见过,检测是否有环,有环则断开环,然后各遍历一遍判断是否相交,比较顺利写完。倒是面试官有点晕,自己在那画环画了好一会儿。
2、搜索题。有个n*n矩阵,n<200,现在从(0, 0)点出发,最终要到达对角(n-1,n-1)点,可以前后左右四个方向走,总步数限定在2n-2到400之间。现在矩阵某些坐标上有金币,给定金币所在坐标,问能吃到最大金币数。
这个真是不太会,说了大概是搜索+剪枝,面试官说我剪枝力度不够,还可以降低一个级别的复杂度,应该动归可以解决吧。然后面试官主动降低难度,假设只能向右和向下,且不限定步骤。这就变成了比较简单的动归了,让写代码,顺利完成。
3、忘了,想起来了再补充。
4、数学题。有个随机数生成器,每次产生一个0-1的随机数,若当前生成的数大于上一个数,则停止,否则继续生成下一个数。问生成序列的长度期望是多少。
开始用数学随机过程思路,想了好久说了个错误的答案,最后在面试官引导下,顺利完成。
18:00-19:15,当时已经面到有点麻木了,也不饿了,面试结束。
HR说下周有结果,希望是个好结果!