什么是这个
本节深入探讨了在算法面试中经常出现的算法和数据结构的实用知识和技巧。你拥有的技巧越多,在面试中成功的机会就越大。它们可能会引导你发现之前可能遗漏的边界情况,甚至可能引领你走向最优解!
每个学习指南的内容
对于每个主题,您期望找到:
- 简要概述
- 学习资源
- 用于特定语言的库
- 时间复杂度速查表
- 面试时需要注意的事项
- 边缘案例
- 有用的技巧及推荐的练习问题
学习指南列表
以下是您应该为编码面试准备的,并且对应的学习指南中的数据结构和算法列表:
主题 | 优先级 |
---|---|
数组 | 高 |
字符串 | 高 |
哈希表 | 中 |
递归 | 中 |
排序与搜索 | 高 |
矩阵 | 高 |
链表 | 中 |
队列 | 中 |
栈 | 中 |
树 | 高 |
图 | 高 |
堆 | 中 |
前缀树 | 中 |
区间 | 中 |
动态规划 | 低 |
二分查找 | 低 |
数学 | 低 |
几何 | 低 |
一般面试技巧
澄清任何无意识的假设。许多问题是故意不明确的。
始终首先验证输入。检查无效/空/负数/不同类型的输入。永远不要假设你得到了有效的参数。或者,向面试官明确说明你是否可以假设有效输入(通常是的),这可以节省你编写代码进行输入验证的时间。
有没有时间/空间复杂度要求/限制?
检查偏移错误。
在没有自动类型强制类型转换的语言中,确保值的连接是同一类型的:int
/str
/list
。
完成代码后,使用一些示例输入来测试你的解决方案。
这个算法是否需要多次运行,例如在网络服务器中?如果是这样,输入可能是预处理的,以提高每次调用的效率。
混合使用函数式和命令式编程范式:
- 尽可能多地编写纯函数。
- 纯函数更容易推理,并有助于减少实现中的错误。
- 避免修改传递给函数的参数,特别是如果它们是通过引用传递的,除非你确定自己在做什么。
- 然而,函数式编程通常在空间复杂度方面代价较高,因为它是非变异性的并且重复分配新对象。另一方面,命令式代码更快,因为你操作的是现有对象。因此,你需要适当平衡准确性与效率,通过使用适量的函数式和命令式代码来实现。
- 避免依赖和修改全局变量。全局变量引入状态。
- 如果你必须依赖全局变量,请确保不会意外地修改它。
一般来说,提高程序速度的方法可以是:(1) 选择更合适的数据结构/算法;或者 (2) 使用更多内存。后者展示了典型的空间与时间权衡,但并不一定意味着你可以只在牺牲空间的情况下获得更好的速度。还要注意,你的程序通常有一个理论上的最大运行速度限制(就时间复杂度而言)。例如,一个要求你在未排序的数组中找到最小/最大元素的问题不能运行得比O(N)更快。
数据结构就是你的武器。为正确的战斗选择合适的武器是胜利的关键。非常熟悉每种数据结构的优势和各种操作的时间复杂度。
数据结构可以通过增强以实现跨不同操作的高效时间复杂度。例如,可以使用哈希映射与双向链表一起使用,在LRU缓存中实现get
和put
操作的O(1)时间复杂度。
哈希表可能是算法问题中最常用的数据结构。如果你卡在一个问题上,你的最后手段可以尝试列举常见的可能数据结构(不幸的是,它们并不多),并考虑它们是否可以应用于问题。有时这种方法对我有用。
如果在你的代码中偷工减料,向面试官坦诚这一点,并说出你在非面试设置下会怎么做(没有时间限制)。例如,我会写一个正则表达式来解析这个字符串,而不是使用split()
,因为它可能没有覆盖所有情况。
推荐课程
导入 AlgorithmCourses from '../_courses/AlgorithmCourses.md'
<!-- ## 参考资料
- http://blog.triplebyte.com/how-to-pass-a-programming-interview
- http://www.geeksforgeeks.org/must-do-coding-questions-for-companies-like-amazon-microsoft-adobe/
- https://medium.com/basecs