PS:此文章为转载,源地址:http://www.newsmth.net/nForum/#!article/CoderInterview/849 作者应该是在美国进行的笔试面试,感觉面试的的公司也很NB,其准备过程很值得借鉴
原文如下:
其实早在8月份我刚来美国的时候我们就开始准备这个事情了。那个时候我通过她的朋友认识了一个在G公司工作的师兄,并且打电话聊了一下。
事实证明这个电话对于我后来找工作的过程有着至关重要的影响。师兄推荐了四本书给我:CLRS,Programming Pearls, Programming Interviews Exposed 和 Career Cup 150.
其实其中的三本我都看过,Programming Pearls也恰好是我为数不多的带到美国的技术书籍之一。八月份的时候我正在雄心勃勃打算读完Concrete Math的后半本,当时听师兄这么一说,正好给自己一个偷懒的借口,重新读读PP,编程序总比学数学容易,是吧。。
当时我正在思考的一个问题其实是如何把代码写得干净整洁。之前其实我在各种网站上做题也不少,但是给出的答案往往都是一坨sh*t一般的代码,面试中也很难在短时间内写出正确的、易读的东西——呃,直到几个月前我还是这个水平,是不是太逊了。。= =
当时重新读编程珠玑的时候,我突然从那个简单的二分查找的例子里面明白了维持不变量在写算法里面的意义。然后我用这个原则试着写了一下二分、堆排、快排、mergesort和kmp,然后就猛然发现牛逼了。。。
关于边界检查,我以前经常要么就是做得过少,要么就是做得过多,建议对于边界检查没有太多概念的童鞋参考一下glibc的strlen, strcpy, memcpy等函数,知道什么样的结果是适度的。
后来到了Pittsburgh之后,俺花了好几十大洋,是真的大洋,买了一本纸板的CLRS,美国的书还是挺贵的,以后谁要来最好还是想办法多带点吧,或者海运一些。。于是在准备简历之余我就开始第四遍或者是第五遍读这本厚书。
期间简历我准备得很差,估计这也是为什么amazon甚至没给我校园面试,在后来很久以后才从简历堆里把我翻出来。这个谁有经验的可以说一下。。
复习算法确实是很必要的一个工作。主要是因为很多不常用的算法会被我忘的一干二净。比如dfs找连通区域。全图最短路径。网络流。。然后我很英明地去看了看以前不是很熟悉的那些数据结构,比如Trie,比如Suffix Tree,比如Treap,Splay Tree等等。Trie值得好好看一下,因为大家经常考字符串处理,图算法也得多了解,因为重现率非常高。至于算法导论前几章的排序和查找。。那是基础。。必须得能倒着背出来(恩。。我不能。)
算法里面最容易在面试中重现的。。我感觉就是hash了。。恩,大家离开hash貌似都活不了的样子。。所以关于hash的各种特性和应用场景也要仔细研究一下。
复习完CLRS之后的一个多月里,事实证明我基本是在做无用功,我把cs:app重读了一遍,可是面试里面基本没人鸟这块的知识,当然关于page fault啊,stack啊heap啊这些玩意的基本概念是要有的,问起来不要露怯就好了。
这段时间里面我基本在topcoder上做练习题。250分的题目基本是1+1=2型,但是正因为简单所以可以练习如何把算法写得简洁正确。500分的题目有简单的又很难的,但是大体还是可以用的。这类题目的难度和面试基本很相近了。如果能在30分钟内完成的话,面试的时候至少速度不成问题。
后来就是cmu的校园招聘大会,一坨公司跑到学校里面练摊,一群学生穿上正装去投简历。。说实话作为一个码农我真不理解为啥要穿正装。。
投过简历之后我收到了m$和ff的面试通知,不过这都当后话了。
后面除了坚持在topcoder上练习,我还读了另外两本书,programming interview exposed和career cup 150。前者其实很扯淡,随便翻翻就好了,后面那本是真的应试宝典,虽然撞上的题目基本没有。。我面了这一坨,一共也就三道题撞上了,但是对于热身和适应难度绝对是*,建议要面试的童鞋都翻翻。其中一些问题的解法都很tricky,对于将来现场能解决一些tricky的问题很有启发意义。
再之后我从topcoder转战了spoj,因为我比较喜欢那边的题目普遍输入输出都很简洁。。有兴趣的也可以去做两道试试。http://spoj.pl