下面把自己的经验和大家分享一下:很多非技术的因素在这里就不说了...
技术方面的准备包括:
1. 仔细钻研一本数据结构和算法的书.每个程序员都知道数据结构和算法的重 要性, 可是为什么呢?最主要的原因就在于经典的数据结构和算法是对常见计算机问题的归纳和总结. 如果你精通数据结构和算法, 当你遇到新问题时,你就 很容易将问题进行定位,比如说这是一个图的问题还是树的问题, 然后在运用系统的知识进行分析. 从而找到解决问题的方法. 例如:如果面试官问你最少可以用多少种颜色来填充中国地图中的各个省的问题, 你就应该想到这是???
所以说,如果当你遇到一个问题时马上能够定位到该用什么数据结构/算法来解决, 着就是面试官首先想要看到的. 推荐一本书: Steven Skiena's The Algorithm Design Manual
1) 算法复杂性分析. 你必须知道如何使用Big O来分析算法的复杂性. 如果你不知道这个,你肯定过不了面试. 如果不知道, 仔细读一下相关的那章. 你完全可以搞定的!
2) 排序算法. 你需要知道排序算法. 不要提冒泡排序法. 真正开发时没人用. 你至少要知道一种n*log(n)的排序算法. 比如: 快速排序法.
3) Hashtables. 你必须要知道如何使用哈希表的使用. 你应该知道如何用你擅长的编程语言来实现一个哈希表.
4) Trees: 你需要了解树型结构, 二叉树, BFS, DFS等遍历算法.
5) Maps: 图非常非常非常非常非常重要. 就算你已经觉得图已经很重要了. 但实际上, 它比你想的还要重要. 你应该了解图在内存中的几种表示法, 比如使用对象和指针, 使用距阵等. 同时你还需要了解图的遍历算法, 以及它们的算法复杂度, 还有如何在代码中实现.
6) 其它的数据结构. 尽量学习书中的其它数据结构和算法.
2. 数学. 有些Google的面试官很喜欢问一些离散数学方面的东西. 所以也需要做一些准备.
3. 操作系统. 你总要了解一些操作系统方面的基础知识. 比如线程和进程,进程间的通信等. 推荐一本书: Doug Lea's Concurrent Programming in Java
4. 编码. 你应该精通一门编程语言, 比如C++, Java. C#也可以接受.
【编辑推荐】