Hello world!
算法面试优秀≠技术面试优秀
技术面试常见问题
- 项目经历和项目中遇到的实际问题
- 遇到的印象最深的bug,是如何解决的(高下立见)
- 面向对象编程
- 设计相关
- 网络、安全、内存、并发相关
- 系统设计(scalability)
- 系统在大规模使用时可能遇到的问题
技术面试优秀≠能拿到offer
过去参与的项目至关重要,通过项目让人了解你
- 慕课网、coursera上的实战课程
- 创建自己的项目:计划书、备忘录、播放器
- 自己解决小问题:爬虫、数据分析、词频统计
- 不是项目的项目:一本优秀的技术书籍的代码整理
- 分享:自己的技术博客、GitHub账号
算法面试并不需要啃完一本《算法导论》
- 刚开始阅读可以跳读,抓大放小;理论证明部分可以略读
- 高级数据结构和算法面试提及的概率很低(红黑树、B-Tree、斐波那契堆、计算几何、数论、FFT)
- 远远不需要达到信息学竞赛的水平
关注基础算法和数据结构
- 各种排序算法
- 基础数据结构和算法的实现,如堆、二叉树、图……
- 基础数据结构的使用:如链表、栈、队列、哈希表、图、Trie、并查集
- 基础算法:深度优先、广度优先、二分查找、递归
- 基本算法思想:递归、分治、回溯搜索、贪心、动态规划……
选择合适的OJ (Online Judge)
解决算法问题的整体思路
- 注意题目的条件
- O(nlogn)的算法
- 无需考虑额外空间:需要开辟额外空间
- 数据规模时是10000:设计O(n^2)
- 当没有思路的时候
- 自己给自己几个简单的测试用例,试验一下(最简单的情况如何求解)
- 暴力解法通常是思考的起点
- 优化算法
- 遍历常见算法思路(对问题做分类,看是哪个算法下的问题)
- 遍历常见的数据结构
- 常规思路
- 空间和时间的交换(哈希表)
- 预处理信息(排序)
- 在瓶颈处寻找答案:O(nlogn)+O(n^2)+O(n^3)
- 实际编写问题
- 极端条件的判断
- 数组、字符串为空?数量为0?指针为NULL?
- 变量名有语义
- 代码模块化、复用性
- 对于基本问题白板编程
- 极端条件的判断
- 优化算法