算法面试


算法面试的误区

算法面试不代表“正确”回答每一个算法问题,合理的思考方向更重要

把这个过程看作是和面试官一起探讨一个问题的解决方案,对于问题的细节和应用环境,可以和面试官沟通

根据具体情况选择更优的算法

“正确”本身是一个相对的概念,比如对一组数据进行排序,不能忽略应用环境,一味的选择速度快的快速排序法等等,而是根据具体情况选择更优的算法

要先看看这组数据的特征,重复元素较多可以选择三路快速排序法,有序性较高可以选择插入排序法,取值范围非常有限可以选择基数排序法,要求排序性能很稳定可以选择归并选择法,完全随机的数据可以选择普通的快速排序法

还要看看数据的存储结构是什么,比如快速排序法要求数据的随机化程度高,而使用链表存储的数据就更适合用归并排序法

如果数据量很大,不足以装载在内存里,需要使用外排序算法

算法面试的准备范围

不要轻视基础算法和数据结构,

比如各种排序算法

基础数据结构和算法的实现如堆、二叉树、图

基础数据结构的使用如链表、栈、队列、哈希表、图、Trie、并查集

基础算法如深度优先、广度优先、二分查找、递归

基本算法设计思想如递归、分治、回溯搜索、贪心、动态规划...

解决算法面试问题的整体思路

要在学习和做题中找到平衡,不能一味的刷题而不理解其背后的思想,刷题不是目的

注意题目中的条件

给定一个有序数组,则可能使用二分查找法更好

设计一个O(nlogn)的算法,则可能先进行排序,再进行后序操作

无需考虑额外的空间,则可能需要开辟额外的空间来换取时间的性能

数据规模大概是10000,则可以使用O(n^2)的算法

根据暴力解法来优化算法

不要忽视暴力解法,暴力解法往往是思考的起点

遍历常见的算法思路如索引指针遍历、递归、分治、贪心、动态规划...

遍历常见的数据结构如链表、栈、队列、堆、树、图...

空间和时间的交换(哈希表)

预处理信息(排序)

极端条件的判断

数组为空、字符串为空、数量为0、指针为NULL

模块化、复用性