How to prepare
- 自己思考,同时要思考复杂度
- 在纸上写code
- 纸上测试code(general cases, base cases, error cases)
- 把纸上的code输入到电脑里,看自己有哪些错误
- mock interview
What you need to know
- Practicing implementing the data structures and algorithm on paper, then on computer
- basic: 2^10 大概是 1000, 2^20 大概是1million(100万),2^30 大概是1billion(10亿)= 1GB, 2^40 大概是 1trillion(1万亿)= 1TB
Walking through a problem
- Listen: 注意一些特别的词,sorted,repeatedly
- Draw an Example: 给定值,足够大,不是一个特殊例子
- 先考虑一个暴力解法,给定时间和空间复杂度
- 优化:看看有没有没用到的信息;考虑一个新的例子;不正确的解决(?);tradeoff时间和空间;提前计算;使用hash table;考虑最佳的runtime
- 检查
- 写代码: 从左上角开始写,避免倾斜,漂亮的代码(模块化初始化方法,做class,错误检查,命名)
- 测试: 概念上的测试(假装自己正在给别人讲代码);有没有看起来奇怪的代码;热点问题;小的测试例子;特殊的例子;
优化
- 查找瓶颈(优化是瓶颈的那部分才有意义)
- 去掉不必要的工作(比如说可以用多一步计算来减少一层循环)
- 去掉重复工作(用hashmap保存下来结果)
- 假装是自己在做,而不是考虑一个算法
- 简化和普遍化
- 从base case开始(n=1)
- 过一遍所有的数据结构:linkedlist不适合accessing和给是数字排序;
- Best Conceivable Runtime(BCR) 可能但是不一定会存在的最优时间,一般用于作为hint,也作为时间优化的上限。如果已经达到这时间,说明时间上不能再进行优化,只能优化空间。
- 当遇到一个考过的问题,要告诉面试官
- 选择语言:java属于比较易懂的,不用考虑memory和指针。java属于比较冗长的语言,例如python可以直接返回多个值,但是java必须要一个class
- 好的代码:正确,高效,简洁,可读性,可维护性
- 正确地使用数据结构
- 写可以重复使用的代码(抽取重复部分写成一个方法)
- 可以抽取成方法的写成一个方法(不要把一个方法写的很长)
- 灵活性(可以对应多种例子,general)
- 要做错误检查,参数认证检查