头条
笔试:头条笔试五道编程题,只AC了一道,其他几道都是通过部分测试用例,最后一道直接放弃因为当时没时间了。没想到这都过了笔试。收到面试通知的时候真的可以说是很惊讶了。
头条的面试效率应该是我面过的所有公司中最高的了,头条是视频面试,我是3月31日下午3:00开始面,到下午6:00的时候三面全部面完,中间基本上只有上厕所的时间,当场面完当场告诉你结果。感觉头条对算法的要求还是比较高的,三场面试基本上大部分时间都是在做算法题。当然项目和基础知识也有涉及。
一面:
一面面试官一看就是一个程序员,视频中的背景一看就是在他住的房间里面,还能看到衣柜。。。他头发挺乱的,给人的感觉就像是刚睡完午觉头发乱糟糟的那种。穿一件黑色T恤,典型的程序员装扮。上来就是一道编程题:合并两个有序的单链表。出完题后他电话就响了,就出去接电话去了,然后留我一个人在那敲代码。题不难,他接完电话回来后基本上我也写完了,然后他让我说了一下思路。然后开始问操作系统方面的,多线程和多进程的区别,Linux下都知道哪几种锁等。后来又说我们再来写一道题,求股票的最大利润,基本题意就是给一个按日期排列的股票价格的数组,任意日期买入,往后任意日期卖出,求能获得的最大利润。(当时拿到这道题,喵喵喵,这不是阿里二面的那一道吗,阿里当时还给了一个公式,题意比较隐晦,没想到头条问这道题的时候这么直接,心中暗喜),当场给出最优解,就是从后往前算,整体时间复杂度O(n),空间复杂度O(1)。面试官看了我的解法之后,感觉他不太相信有空间复杂度O(1)的解法,反复地问我算法的思路,最后总算是给他讲明白了,然后就告诉我一面过了,让我在线上等一会儿,应该会有二面。(PS:我后来才发现这道题原来是《剑指offer》的原题,只是当时忘了,还好给出了最优解)
二面:
一面结束很快就开始二面了,二面视频背景应该是在公司,办公环境还比较不错。二面面试官先让我做一个自我介绍,然后说:我看一面面试官对你评价很高啊。我:哈哈哈 是吗。(心想很可能就是一面那道题我给出了一个最优解,有点出乎一面面试官的意料,可能他当时并不知道有这样的解法,感谢阿里二面,感谢《剑指offer》)。然后二面面试官上来又是一道编程题:删除二叉搜索树中特定的节点。我当时拿到这个题的时候一脸懵逼(后来知道是LeetCode原题,只是自己没有刷到orz)。后来在二面面试官的提示下找到了删除节点的方法,勉强写了出来。然后还问了一个比较有意思的题,给一个单链表,怎样随机返回其中的某一个节点?我给出的解法是先按链表长度随机生成一个随机数,再去链表中走相应的步数,返回那个节点。又问我如果链表很长怎么办?我:有多长? 他:无限长。(我:喵喵喵)。最后我给出的解法就是将无限变为有限,把链表分割成有限长度的小链表,再去随机取小链表中的节点。然后他好像勉强接受了这个解法,然后问了一些项目方面的问题,最后说让我在线上等一会儿,应该会有后续的面试。
三面:
很快就到了三面,三面上来也是一个算法题:给一堆扑克牌,设计一个算法将它打乱,越乱越好。我给出解法之后让我分析时间复杂度和空间复杂度,让我分析打乱的效果,怎么去衡量打乱算法,能不能给出一个更好的算法等等。(我后来才知道原来他问的是经典的洗牌算法)但是当时并不知道,只能按照自己的理解给出算法,然后再分析看有没有更好的算法。然后开始问我项目,问最小编辑距离算法,TF-IDF算法(因为我项目中有写),分析时间复杂度,问知不知道协程等等。最后面试结束,也没给具体结果。后来HR打来电话说两周内才会出结果,让我耐心等待。(今天已经4月9号了,一个多星期过去了还没有消息,我只想说虽然头条面试效率高但是总体等待的时间一天也没少)
头条面完之后我开始总结,其实面试过程中问到的一些算法之前都没有了解,像那个洗牌算法和删除二叉搜索树中节点的算法,在之前没有接触过这类的题的时候,想要通过面试,那就只有在面试的过程中不断思考解决方法,如果能在面试官的提示中找到解法,并展示出自己的coding能力,还是很有可能通过面试的。所以面试过程遇到不熟悉的问题不能方,一定要不断尝试去解决,在解决问题的过程中展示出来的能力往往是面试官看中的。
今天晚上收到头条HR的电话,算是给了一个口头offer了,三面过去竟然等了这么久,一度以为自己挂掉,接到HR电话的那一刻还是比较开心的啦!
总结:
总的来说吧,面了这么多家公司,感觉在每场面试之后不断总结,不断改进,不断反思是最重要的。
更多高级Java必考题与答案
答案获取方式: