技术笔试的备考经验
就说说对技术笔试的看法。多数公司考的很基础,在参加笔试前,问问自己:你对线性表、二叉树、堆、栈、散列这些基础数据结构有多少了解?你能迅速的写出常见的各种排序的一般实现么?你对算法的时间和空间复杂性有概念么?你对C的了解有多深?你看过《C专家编程》或者《C和指针》么?你的C++经验有多少?你至少完整的看过一遍《C++ Primer》或《The C++ Programming Language》么?你看过Effective和Exceptional系列么?你对标准库的理解是什么?上面的这些问题如果你都可以做出肯定的答复,那你已经基本可以应付技术笔试了。
也许有人问,有这么多东西要看,我该怎么准备?个人认为可以分四块:语言、数据结构、算法和其他知识:
语言:我熟悉C/C++,就拿它说事。语言的基础不难,不过是变量、函数、表达式、流控制等等。谭老师的教材和林锐的书都是很好的入门材料。尤其是林锐,着重突出容易犯错的地方,象sizeof(char*)和sizeof(char[]),都是容易考到的,而且对一些高级话题,比如,vtable、vptr等都有涉及,可以让人对C++里让人比较迷惑的东西有个直观的认识。有人把他的书和《Inside C++ Object Model》比,骂的一文不值,我觉得没必要这样,不是每个人都要成为Lippman、Stroustrup这样的大师,科普读物会让更多的人对科学产生兴趣。
对编程经验在1w行以上的同学,语言基础已经是小case。C高级编程系列,《C++ Primer》,《The C++ Programming Language》,Effective和Exceptional系列是你应该熟悉的。比如Adobe考试中的设计不可继承的类这种技巧基础课本里是不会提到的。你也应该熟悉标准库,对常见的容器、迭代器、算法应该有所了解。我个人觉得《Generic Programming and STL》、《Thinking in C++》2e的下册和《Effective STL》是很好的教材,当然边看还要边练练。
数据结构:对数据结构我没什么特别深入的研究。本科时候用清华严老师的教材,学的一塌糊涂,研究生自己把图书馆的数据结构书差不多都翻了一遍,感觉是大同小异。基础的数据结构《Algorithm in C++》里讲的很好,实现也很优雅。高级数据结构,象红黑树、B树、二项堆、Trie之类的《算法导论》里有所涉及。
我认为应付一般的笔试/面试《Algorithm in C++》已经足够,如果想去百度之类对基础知识要求比较高的公司,你就需要对AVL,B树,Trie这些高级结构有比较深刻的了解。因为查找和排序是百度最看重的技能之一,就拿百度今年在北邮的海笔说,那道IP地址的题可以用区间树或者基数排序解,而另一个查找子串的题目无非是KMP(我当时写了一个朴素查找依然过关)。数据结构的复习强调多练习,难度以《数据结构》考研题目为准,这方面的书很多,我不多说。
算法:算法是我最没信心的部分,找工作前狂补了几个月也没什么成效。我个人的经验是《算法导论》确实好,但它里面过多的证明确实影响算法菜鸟学习的积极性,第一次阅读时建议跳过。我更加推崇的书是《Algorithm in C++》,Knuth的学生写的。里面不但有很多的图示也有精巧的实现,不管是数据结构还是基本算法的学习都是相当好的教材。主要看第一本,即《基础、数据结构、排序与查找》。看完一个算法合上书,看看自己能不能写出来。
看了书还要做题,我没做过多少算法题目,直接导致被有道、EMC鄙视,其实现在看来他们考的也都是很基础的东西。我这里推荐《算法设计与实验题解》,里面对递归、分治、dp、greedy这些经典常考的算法给出了很多题目和解答,几乎包含了笔试可能考到的一切。比如有道高级编程题中的区间覆盖问题,即是其中的原题,而另一道凸包问题是计算几何的经典问题,只要涉及到计算几何的书都有讲。