让大家在面对面试中的算法的问题时,有一个合理的思考路径;
因为面试中的算法问题,通常并不“复杂”,远远不需要啃完一本《算法导论》面对算法面试,不畏惧
如何轻松的解决算法面试呢?
- 算法面试不代表一定“正确”的回答每一道算法问题,但是合理的思考方式其实很重要,也是正确完成算法面试的前提
- 算法面试优秀不意味着技术方面优秀
- 技术面试优秀不意味着能拿到Offer
什么是给出合理的思考路径
首先算法面试目的不是给出一个“正确”的答案,而是要向面试官展示你解决问题的思路。“正确”本身就是一个相对的概念!
- 算法面试不是考试
- 把这个过程看作是和面试官一起
探讨
一个问题的解决方案 - 对于问题的细节和应用环境,可以和面试官
沟通
,这种沟通本身很重要,它暗示了你的思考问题的方式。 - 不要把自己当做解题的机器,一定记得调动你自身的积极性、热情。
比如面试官问你:“我们需要对一组数据进行排序” 我们该如何回答?
如果你只是说我考虑采用“快速排序”算法,它的时间复杂度 O(nlogn)相对于其它排序来说它的时间复杂度是最优的,所以我会选择它。
但是这种回答并不一定会让面试官满意,因为基于这个回答你只能让面试官只能看出来你确实会“快速排序算法”,可以你却忽略算法使用的具体环境,而在实际的项目中很多时候其实是有诸多正确的选择,而此时我们关注的不仅是“正确”,而更关注于更“优”。所以此时你就应该和面试官探讨,这组数据有什么特征?
一组数据进行排序,问题情况分析
-
1. 说它是不是包含有大量的重复元素?
如果有这种可能的话,三路快排
是更好的选择 -
2. 如果可以肯定这组数据的所有元素都是独特的
使用普通的快速排序就可以了 -
3.这组数据有什么样的特征?
是否大部分数据距离它正确的位置很近?是否近乎有序?
银行业务按照业务的发生时间进行排序,这样的数据大多数都是在业务完成是存入库,如果按照业务发展的顺序去看他的话,就是近乎有序的,只有少数业务晚于业务时间查询。
此时,插入排序
是更好的选择
4.数据取值范围是否有限?比如对学生成绩排序
这种情况,计数排序
是更好的选择5.对排序有什么额外的要求?是否需要稳定的排序?
如果是的话,归并排序
可能是更好的选择6.数据的存储结构是怎样的?是否使用链表存储?
如果是的话,快速排序
就不适用了,而归并排序
可能是更好的选择7.数据存储状态是怎样的?大小是否可以装载到内存里?
数据量很大,或者内存很小,不足以装载在内存里,需要使用外排序
在面试过程中如果遇到了非常难的问题,对于你的对手来时也是难的。
关键在于你所表达出来的解决问题的思路。甚至通过表达解题思路的方向,得出结论:这个问题的解决方案应该在哪一个领域,我可以通过查阅或进一步学习解决问题。
面试中经常被问到的问题点
- 项目经历和项目中遇到的实际问题
- 你遇到的印象最深的bug是什么?
- 面向对象编程
- 设计模式
- 网络安全;安全相关;内存相关;并发相关 ...
- 系统设计
所以在准备算法面试的同时,也不要忘记上面的点。
技术面试优秀不意味着能拿到Offer
技术面试只是面试的一部分。面试不仅仅考察你的技术水平,还要了解你的过去以及形成的思考方式,行为方式。
关于过去:参与的项目至关重要
准备好合适的问题问面试官
- 整个小组的大概运行模式、工作模式是怎样的?
- 如果后要做的这个项目后续的规划是怎么规划的?
- 对于产品中的某个问题是如何解决的?比如,你们公司遇到分布式事务解决方案?
- 参与项目用的技术?为什么选择某些技术?选择技术的标准? 比如,为什么选择用angluar,而不是vue?
- 我对某项技术很感兴趣,在你的小组中我会有怎样的机会深入其中?
如何准备算法面试
这里再次强掉一点,算法面试和面试时两个概念。算法面试只是面试中的一个环节。
不要轻视基础算法和数据结构,而只关注有意思的题目
- 各种排序算法
- 基础数据结构和算法的实现:如堆、二叉树、图...
- 基础数据结构的使用:如链表、栈、队列、哈希表、图、Trie、并查集..
- 基础算法:深度优先、广度优先、二分查找、递归...
- 基础算法思想:递归、分治、回溯搜索、贪心、动态规划...
解决算法面试问题的整体思路
注意题目中的条件
比如,给定一个有序数组...有一些题目中的条件本质就是暗示:
比如,设计一个0(nlogn)的算法无需考虑额外的空间
就要考虑能不能开辟额外的空间,用额外的空间来换取时间优化。数据规模大概是1000
设计一个O(n2)的算法就可以,因为O(nlogn)是可以处理百万级数据的
当没有思路的时候
不要忽视暴力解法。暴力解法通常是思考的起点。
例子:在一个字符从中寻找没有重复字母的最长子串
如"abcabcbb",则结果为"abc"
"bbbbb",则结果为 "b"