算法面试只是面试中的一个环节
误区
- 算法面试并没有那么难。
- 有选择的读《算法导论》等经典书籍,不能追求一步到位,学习切忌完美主义。
- 高级数据结构和算法面试提及的概率很低。
- 远达不到信息学竞赛难度
算法面试准备范围
不要轻视基础算法和数据结构,而只关注“有意思”的题目。
- 各种排序算法
- 基础数据结构和算法的实现:堆、二叉树、图…
- 基础数据结构的使用:链表、栈、队列、哈希表、图、Trie、并查集…
- 基础算法:深度优先、广度优先、二分查找、递归…
- 基本算法思想:递归、分治、回溯搜索、贪心、动态规划…
选择合适的OJ
- LeetCode
- HackerRank
在学习和实践做题之间掌握平衡,不要一味的刷题
解决算法面试问题的整体思路
注意题目的条件
- 给定一个有序数组… 二分搜索
- 一些题目中的条件本质是暗示:
设计一个O(nlogn)的算法。 分治思想
无需考虑额外的空间。 空间换时间
数据规模大概是1000。 n*n的复杂度
当没有思路时
-
自己给几个简单的测试用例,试验一下
-
不要忽视暴力解法,暴力解法通常是思考的起点
例如:
LeetCode 3 在一个字符串中寻找没有重复字母的最长字串。
- 对于字符串s的子串s[i,…j]
- 使用O(n^2)的算法遍历i,j,可以得到所有的子串s[i,…j]
- 使用O(length(s[i…j]))的算法判断s[i,…j]中是否含有重复字母。
复杂度O(n^3),对于n=100的数据量,可行
优化算法,如何对问题进行优化
- 遍历常见的算法思路
- 遍历常见的数据结构
- 空间和时间的交换(哈希表)
- 数据预处理(排序)
- 在瓶颈处寻找优化的位置:O(nlogn) + O(n^2),
实际编写问题
1.极端条件的判断
- 数组为空
- 字符串为空
- 数量为0
- 指针为NULL
2.变量名
3.模块化,复用性
基本问题达到白板编程的水平