心路历程那些话就不说了. 每个找工作的人在没有offer前都是一样的...
1.CTCI一遍, Leetcode, 一亩三分地+mitbbs的面经, 然后坚持每个面过的面试题都再重新写写一遍(尽可能的做到最优).
3.对于写Java的同学, 建议先去ProgramCreek.com上把关于java基础概念的帖子看完, 再开始做算法. 因为不少面试会问到java的基础知识问题, 只刷题这方面容易忽略.
从我将近30轮的面试经历来看, 简历的作用只有一个: 帮我拿到面试.
面试的时候, 全部是coding, 根本没人看我简历. 最多最多让你挑一个你觉得有意思的项目来讲下.
既然这样, 建议写简历的时候千万千万不要谦虚(你再吹都吹不过三哥), 不然面试都没有, 什么都是白搭. recruiter看你简历的时候, 他也不认识你, 你说什么那就是什么.
我周围有很多背景还是可以的, 就是没面试, 唯一的可能就是简历出了问题. 如果因为简历不好没拿到面试的, 可以历好好改下简历, 然后换个名字, 换个邮箱, 不留电话, 重新投. 简历上可以不用写真名, 真名一般就onsite的时候, 买机票必须要.
我这学期毕业, 2月开始投刷题和简历, 面试从3月开始, 没offer前一直在投, 4月中旬收到3个offer结束, 结束的时候还有两个公司没面完.
我这个时间算比较晚了, 建议第二年一开学就开始找new grad全职. 当时投的时候, 发现Yahoo和LinkedIn基本已经招满了. 原来联系我去面试的recruiter也不理我了.
然后其他的几个大公司全部找人内推, 包括学长, 实习时候的老板, 还有LinkedIn上直接搜"公司+USC", 找到一个USC的, 就直接发站内信, 求内推. 总之尽量内推, 实在不行在网投.
第一次面试开始前,就刷了CTCI那本书和leetcode 30道高频题. 后来边面面试边刷, 逐渐刷完leetcode全部. 由于我之前的编程的经验还可以, 所以刷起来没有花太多时间在理解算法上面, 主要是记忆一些通用的解法.
1. BST的add, find和delete函数
2.给string, 只包含{0,1,?}, ?可以代表0或者1, 输出所有的组合. 例如"10?", 输出"100", "101"
onsite:
5.shuffle数组, 输入是一个数组, 没排序, 输出是奇数index的数字比相邻的偶数数值大即可. O(n)
6.加试电面, 写jump iterator类, 构造函数传入一个普通的iterator, 然后实现next(), hasNext(). next()返回传入iterator的next().next(), 就是每次跳过一个元素输出.
然后再实现一个rotateIterator(), 构造函数传入List<Iterator<T>>, 实现next(), hasNext(). 例如:
传入的三个iterator里面的值分别是[[1,2,3],[4,5,6], [7,8]], 那rotateIterator的next()应该输出[1,4,7,2,5,8,3,6]. 就是竖着遍历每个iterator输出, 如果当前的iterator没有了, 就跳到下一个.
Facebook:
我觉得Facebook是有题库的, 因为当我面试完的时候, 回去看网上的面经和问其他onsite的同学, 重复度相当高. FB的题目都不难, 关键是代码要bug-free, optimal, 然后能多写一种解法就多写一种.
1.anagram, 输出一个句子, 里面的单词是空格隔开, 输出list of anagram in this sentence. 就是List<List<String>>.
2.sort colors, 三色旗问题, 用swap, O(n)时间, O(1)空间.
3.Pow
4.给一堆point(x, y), 返回前k个离远点最近的点, 用k-selection算法, 核心就是那个partition, 平均时间复杂度可以做到O(n).
5.实现哈希表, 只实现lookup()和add()
6.树的中序遍历和前序遍历的iterative代码.
11.给一个每行和每列都排序好的矩阵, 求第k大的数值. 可以用heap做.
12.Lowest common ancestor, 注意要写CTCI上面那个代码, 输入可能不来自同一棵树.
13.给一个span(min, max)和BST, 返回一个子树, 子树里面的节点都在这个span里面.
14.jump river的题目, 给一个数组[1,0,1,0,1], 1代表可以站, 0不可以站. 从速度为1开始往前跳, 每次跳的时候, 可以跳当前速度那么多格, 也可以跳当前速度+1那么多格. 问最少跳几次可以跳过河(即跳出数组), 或者跳不过河. 解法直接递归+cache就可以. 上面的例子跳2次就能跳过河了, 第一次从index=0, 速度为1跳到2, 然后速度为2刚好跳出去.
Facebook onsite的时候还有一轮Culture Fit面试, 除了讲讲你的简历, 下面几个问题经常会问到:
1.为什么选Facebook?
2.给FB的一个产品提点改进意见.
3.当你和你的同事有冲突了, 怎么解决? (focus on "let the code talk")
4.最近在读什么书?
Twitter:
Twitter 我面试了两个职位, Site Reliability Engineer和普通的software engineer. 先面完SRE(4轮电话+5轮onsite), onsite没过, 然后又给我安排SDE的面试, 面了一轮我就收到FB的offer了, 就终止了Twitter的面试.
SRE问了很多OS, 文件系统, 网络, shell和trouble shooting的问题, 太细就不说了. 我就说下遇到的算法题.
0.online test的话, 自己去搜其他的面经吧, 我当时的online test的题目基本和其他人的面经差不多.
1.给一个数组, shuffle. (我记得不说非常清楚, 大概是)当前的数值的三次方是前两个数值的三次方的和.
2.2sum, 3sum
3.trap rain water
6.Python语言的问题, 包括GIL, iterator.
7.Machine Learning问题, SVM的原理之类.
Amazon:
我直接是group interview, 没有电面, group的题目网上能找到, 太长我就不说了.
我知道的一些onsite题目:
1.BFS搜一些product和friend.
2. 3Sum
3.validBST
4.word search in grid.
5.序列化BT, 反序列化BT和BST
Square:
这个公司据说近况不太好, 我当时就面了一轮电话, 没答好就挂了.
1.给一堆源代码文件, 每个文件有dependency on 其他源代码文件, 就像java里面, 会import其他的源文件. 写个函数检测这堆源代码文件里面有没有circular dependency.
抽象出来, 就是检测一个有向图里有没有环, 用BFS就可以, 如果搜到以前已经访问过的节点, 就有circle.
SalesForce:
找到一个manager内推的, 安排了一个面试, 结果面试的那个组做ruby的, 我不懂, 就没什么好聊的, 问了一个binary search的简单问题, 就结束没有后续了. 而且那个组在Indiana…
Bloomreach:
这个startup还是不错的, 就在Google总部旁边, 我面了一轮就收到其他offer, 没继续面了.
1.输入是log文件, "customer, query, url". 读这个文件, 返回每个customer搜得最多的query和对应的url.
follow up如果输入文件很大, 怎么map-reduce来做, 描述下怎么写出简单mapper和reducer.
Zillow:
这是一家在西雅图的租房卖房交易平台公司,是上市公司, 总部是个海景房, new grad给面试给的很多, 有题库. Offer package刚刚高于100K, 略低于Amazon.
1.Lowest common ancestor.
2.给一个数, 判定他的二进制表示是否是一个palindrome, 比如3的二进制是11, 就是palindrome.
5.给一个字符串, 返回第一个出现了一次的字母.
6.给一个字符串, 还有一个字典, 返回这个字符串否被字典里的单词分割. follow up, 出了hashSet, 还能怎么表示字典, trie.
7.validBST
8.给一个sorted array和一个数值v, 返回subarray的中位数, subarray就是array里面数值大于v的数组成的. 算法就是binary search找到subarray的开始index, 然后计算中位数.
9.reverse 字符串的单词顺序, "i am boy" -> "boy am i". in-place的, 算法就是整个string reverse一遍, 然后每个单词再reverse一遍.
YP:
这家公司在洛杉矶, 是一个广告公司, 规模也不小了. offer在洛杉矶算比较高的了, package有110K. 我投的data warehouse engineer. 题目全是数据库和SQL的, 算法题目都比较简单.
1.实现iterator.
2.BST序列化和反序列化.
3.SQL的话, 都是简单的设计, 还有Query, query最难的就是输出每个group的最大值. 比如有enrollment(student, class, score)和student两张表, 输出每个class的成绩最高的学生的名字和分数.
最后分享一点点面试心得:
1.电话面试的话, 大家应该都有两个显示器, 一个用来打代码, 另外一个屏幕可以把自己之前写的算法题目代码打开, 如果遇到之前写过的, 直接搜, 或者Google, leetcode都行. 当然, 搜的时候注意键盘声音要小.
2.onsite, 如果遇到之前做过的题, 你要么直接给面试官说做过了, skip到下一题(理论上如果你胆子够大, 遇到一个很难的题目, 也可以假装说做过了, 要求skip, 不过可能被拆穿).
要么就假装没做过, 演戏. 演就一定要演真一点, 不要一口气3分钟就直接把昨晚背的代码写出来, 又optimal又bug-free的, 这样也太明显了. 最好还是一步一步的来, 就当重新做了一遍, 从简单的算法入手, 一步一步优化, 和面试官"沟通", 假装灵光一闪, aHa, 得到optimal的solution, 化身影帝, 大功告成.
千万不要做到一半, 给面试官说自己之前做过这个题目, 我有血的教训. 下场就是不仅这道题不算, 面试官还认为你不诚实, 而且还没时间做下一道题目.
3.白人普遍fair, 不会刁难也不会放水. 三哥三姐看RP, 校友都很好, 毕竟都是一个算法老师教出来的, 同师同门, 不是校友被黑出翔的几率很大. 中国人都很好, 我就Twitter遇到1个国人. 不过我有同学RP爆发, Google onsite, 4轮3个中国人, 这feel...
4.找工作期间多攒RP, 从小事做起, 比如没事打扫house卫生, 清理灶台, 倒垃圾, 接送其他要面试的同学去机场. 这辈子没有比这段时间更需要RP的时候了.
写了这么多面经, 也差不多业界良心了. 衷心感谢之前分享自己面经的同学, 不管是mitbbs还是地里的.
我最后选择去Facebook, package比其他offer高不少, 毕业入职后, 只要没被layoff, 联系我内推肯定没问题. 祝大家找工作顺利.
补充内容 (2014-4-24 06:10):
Zillow面试的时候, 第四轮也是最后一轮是CTO亲自上阵, 问简历和一个简单的log分析问题. 如果你没见到CTO, 或者只面了3轮, 基本估计是挂了.
补充内容 (2014-4-25 01:25):
在所有的leetcode solution博客里面, 对于Java来说, 这个"二娃"的博客讲得不错:
http://www.cnblogs.com/lichen782 ... ow_substring_3.html
当然还有那个: programcreek.com.
补充内容 (2014-4-25 01:28):
CTCI如果有不理解的地方, 这个中文网站上包括了所有的CTCI solution的中文详解:
http://hawstein.com/posts/ctci-solutions-contents.html
补充内容 (2014-4-25 01:30):
如果要准备系统设计题(NewsFeed之类), 这两个博客讲得很好, 看看面试就够用了:
http://dongxicheng.org/search-en ... ng-in-finging-jobs/
http://blog.csdn.net/sigh1988/article/details/97903
补充内容 (2014-4-25 01:33):
上面那个系统设计问题的第二个网站链接错了, 应该是:
http://blog.csdn.net/sigh1988/article/details/9790337
补充内容 (2014-4-26 01:20):
关于简历应该怎么弄, 60楼我写了一点点个人经验.
关于GPA, 我觉得其实不太重要, 低于3.5就别写在简历上了, Google, Oracle会要非正式的成绩单.
补充内容 (2015-5-1 05:31):
如果有自信的话, 希望找FB内推可以联系我. 把自己的背景和简历发送到
exsonic@163.com, 以"FB内推"为标题即可.