题图:正在滴血的谷歌
最近 google 在我大陆又火了一把,谷歌不能用了,哎呀,尼玛。还让不让程序员活了。在这个节骨眼上,我也来凑个热闹,对于广大需要谷歌的程序猿们,送上两个字:呵呵
昨天在 csdn 上看到一位兄台的文章《给所有面试官》,吐槽了下极品面试经历。对于这位兄台所遇到的极品面试官,本人同样送上两个字:呵呵
我曾经也参加过一些大大小小的公司笔试、面试,牛掰如阿里百度腾讯,犀利如 Google,Mircosoft,盛大研究院,无一例外,均将我秒杀。让我一度怀疑自己是否是程序员的料,幼小的心灵从那时起,留下了巨大的阴影。当然,N次大公司的面试失败以后,归结成两条经验教训:缺乏笔试面试的技巧,非科班出身(实质是计算机知识不成体系)。
关于面试笔试,就六个字:技巧+实力+运气。本文只涉及四个字:技巧+实力。当然,本文的技巧,不同于一般意义的“技巧”。
面试笔试是需要技巧的
面试是需要技巧的,这一点没有人否认。笔试、面试时有相当比例的题目的是跟程序员相关,但又没那么紧密相关的东西。比如考察逻辑思维能力、抽象思维能力的题目,大公司尤其注重这一点,感觉有点测试智商的味道。好吧,我承认,我的智商有时候不够用。不可否认有极个别的聪明人存在,这些天才,思维活跃,面对一些极品难题,他们都能佛挡杀佛。但事实上大部分人的逻辑思维能力,都是通过平时有意识的锻炼出来的,而不是与生俱来的。想看看自己的智商有多少漏洞,请点这里:门萨-智商黑洞
我想说的是:只要你不笨,只要你有意识去锻炼自己这方面的能力,这个东西其实跟你的知识体系的建立是一样的,得靠积累。如果你没事只知道刷微博,刷朋友圈,你的“智商”也永远是停留在那个水平。
曾遇到一个面试官问了这么个题目,至今印象深刻,分享给大家,看看自己的脑袋还够用不。
题目:
给你两个一模一样的玻璃球,已知这种玻璃球,从一栋总共有一百层楼的高楼的某一层楼X扔下来,刚好破碎(即在X层以下不会摔碎,在X层以上均会摔碎)。让你用最少的次数找出这个临界楼层。(注意:你只有两个玻璃球,所以只有两次蛋碎的机会。并假设,每扔一次球,如果球没碎,它的坚硬程度不发生改变)。
最差答案:
一种最差的解法如下:从第一百层楼开始扔玻璃球,如果没有摔碎,则跑到第 99 层楼扔,以此类推,最坏的情况是,在第一层楼扔的时候球才摔碎。因此最大需要扔 100 次才能找出临界楼层。(这种解法,我们只用了一个玻璃球,另外一个玻璃球还没用上啊!)
若有兴趣,可以看看苹果公司的这几个面试题目:苹果向求职者抛出的 8 大难题
面试笔试是需要实力的
程序员面试笔试,考察的技术相关的东西主要有:编程语言、算法、设计模式、操作系统、项目经验等等。基本功扎实了,面试笔试就有底气了,如果再多点实际工程经验,那么面试对你来说,就是五个字:那都不是事。
===========华丽丽的分割线============
废话说了这么多,进入本文主题,如何用一个月的时间去准备 google 的技术面试??
这个问题已经被问过无数多遍,也被无数人回答过。我结合自身的经验教训,来梳理总结一下。
一
1. 1 过一遍常用的数据结构:链表、hashu.html" target="_blank">二叉树、堆树(Tree+Heap)、(红黑树、AVL)(可选)。队列、堆、栈、hash 表。
1. 2 研究一下上述数据结构在你熟悉的编程语言中是如何实现的。例如,如果你熟悉 Java,可以学习下 HashMap、LinkedHashMap、TreeSet、HashSet 等等这些常用数据结构的实现。
1. 3 自己动手编码实现这些数据结构,而不是仅仅写出伪代码就完事了。
二
2. 1 过一遍你课堂上学过的经典算法:各种排序算法、图的遍历算法、最短路径算法等等。
2. 2 知道怎么求一个算法的时间复杂度。
三
3. 1 用你熟悉的编程语言实现第一、第二两部分。在编码实现的过程中,试着不借助任何参考资料来完成。
3. 2 在完成 3.1 所说的编码后,试着从时间、空间两个维度去优化你所写的程序。
四
练习面试问题。选择一本面试相关的书,例如《Cracking the coding interview》,亲手练习一下书中的题目,在纸上书写或在 IDE 中编写都行。(PS:很多面试官都喜欢让你在纸上写程序,所以,有意识的练习练习吧,不要太依赖 IDE 了)。在解答相关面试题时,注意不断改进、优化你的解法。例如,将时间复杂度从n*n优化到 nlogn。
五
练习在白板上分析、解决问题,并能够将你解决问题的思路清晰的表达出来。(这一点要求比较高,尤其对一些“羞射”的程序员们)。在解决某一个给定问题时,对于你给出的解决方案,你得有充分的理由。你为什么选用这种数据结构,这种算法来解决这个问题。
上述五大点是真的很重要,我自己曾经在这上面就犯了眼高手低的错误,只亲手实现了其中的一部分。在只有一个月时间的情况下,时间安排如下:
1)最多用 1.5 周的时间完成第一点和第二点。
2 )至少花一周的时间彻底搞懂你尚未明白的问题。
3 )然后剩下的时间,在白板上编码实现吧。