1-1 算法面试不仅仅是正确的回答问题
远远不需要啃完一整本《算法导论》
算法面试不是高考
把这个过程看成是和面试官一起探讨一个问题的解决方案
对于问题的细节和应用环境,可以喝面试官沟通
这种沟通本身很重要,它暗示着你思考问题的方式
比如,要求对一组数据进行排序
那么我们要跟面试官讨论,这组数据有没有什么具体特征
- 有没有大量重复元素?---> 三路快排
- 没有大量重复元素? ---> 普通快排
- 是否数据近乎有序?--->插入排序
- 是否取值范围有限?比如学生成绩 ---> 计数排序
- 对排序是否有额外要求? 是否稳定?---> 归并排序
- 数据的存储状况?是否使用链表?---> 归并排序
- 数据的存储状况?内存很大或者很小不足以装载在内存里---> 外排序
“正确”还包含了对该问题的独到见解;优化;代码规范;容错性
1-2 算法面试只是面试的一部分
项目经理和项目中遇到的实际问题
你遇到的印象最深的bug
面相对象
设计模式
网络相关;安全相关;内存相关;并发相关
设计系统;scalability: 我的系统在大规模使用上会遇到的问题
创建自己的项目:
自己的小应用:计划表;备忘录;播放器
自己解决小问题:爬虫;数据分析;词频统计
分享:自己的技术博客;github等
1-3 如何准备算法面试
远远不需要啃完一整本《算法导论》
高级数据结构和算法面试提及率很低:红黑树、计算几何、斐波那契堆、数论、B-tree
算法面试的准备范围:
- 各种排序算法
- 基础数据结构和算法的实现: 堆、二叉树、图
- 基础数据结构的使用:链表、栈、队列、哈希表、图、Trie、并查集
- 基础算法:DFS、BFS、二分查找、递归
- 基本算法思想:递归、分治、回溯搜索、贪心、动归
1-4 如何回答算法面试问题
注意题目的条件
- 给定一个有序数组(有序)
- 设计一个o(nlgn)的算法(八成离不开分治)
- 无需额外空间
- 数据规模大概是10000
当没有思路的时候
- 测试用例走一遍
- 暴力解法
优化算法(培养出一种思路)
- 遍历常见的算法思路
- 遍历常见的数据结构
- 空间换时间(哈希表)
- 预处理(先排序)
实际编写代码
- 极端条件的判读
- 数组为空?字符串为空? 数量为0? 指针为null?
- 变量名尽量有意义且通俗易懂
- 模块化、复用性