《玩转算法面试 leetcode题库分门别类详细解析》学习

学习记录

20200523

参考:《玩转算法面试 leetcode题库分门别类详细解析》

开篇

比起“正确地”回到每一个问题,合理的思考方向更重要

算法面试过程中,对于问题的细节和应用环境,可以和面试官沟通,以此反映出你逐步深入思考问题的过程,体现你思维全面与否、想得是否更深刻以及你的计算机素养如何。 “正确”本身是一个相对概念,包含了独到见解、优化、代码规范、容错性。

例子

问:对一组数据进行排序
答:快速排序算法O(nlogn)
改进1:数据有何具体特征?

如有无可能包含大量重复的元素 —> 如果有,那么三路快排是更好的选择。

如有无可能大部分数据距离它正确的位置很近,是否近乎有序 —> 如果有,那么插入排序是更好的选择。

如有无可能数据的取值范围非常有限,例如对学生成绩排序 —> 如果有,那么计数排序是更好的选择。

是否许哟啊稳定排序 —> 如果是,归并排序是更好的选择。

改进2:数据的存储状况是怎么样的?

若是链表来存的,那么归并排序是更好的选择。

数据是否可以装在内存中 —> 数据量很大或者内存很小,需要使用外排序算法。

遇到非常难的问题——关键在于表达出你解决问题的思路。甚至可以说出,这个问题的解决方案应该在哪一个领域,可以通过进一步学习来解决。

算法面试优秀 != 技术面试优秀

算法面试只是技术面试的一部分。

一般会问项目经历,项目中遇到的实际问题。

体现你解决问题的能力,考察你的实际参与程度,以及仅仅只是完成了任务还是对项目中一些技术点进行了深入的思考,再由此判断你对于技术的态度。因此写在简历上的项目要仔细地梳理

你遇到的印象最深的bug是什么,如何处理的。

技术水平的深度由此高下立判。

其他:
面向对象
设计模式
网络相关、安全相关、内存相关、并发相关…
系统设计、scalability

技术面试优秀 != 拿到offer

公司不仅仅考察你的技术水平,还要通过过去了解你的思考行为方式。

参与的项目至关重要:

工作真实项目
研究生项目
实习
参与实战课程学习——慕课、Coursera…
创建自己的项目——如一本优秀书籍的代码整理。github、技术博客。

其他:

遇到的最大的挑战
犯过的错误
遭遇的失败
最享受的工作内容
遇到冲突的处理方式
做得最与众不同的事儿

准备合适的问题问面试官:

整个小组的大概运行模式
整个项目的后续规划是如何的
这个产品的某个问题是如何解决的
为什么会选择某些技术?标注?
我对某个技术很感兴趣,在小组中有何机会来深入这种技术?

算法面试

常见误区:远远不需要啃完一本《算法导论》,因此书强调理论证明,如果花很多时间在上面,会有很强挫败感,也无法在有限的时间内搞定算法面试的准备,要抓大。此外,高级数据结构何算法一般很少提及,包括红黑树、B-Tree、计算几何、数论、FFT、斐波那契堆。此外,算法面试也远远不需要达到信息学竞赛的水平。

注意事项:不要轻视基础算法和数据结构,而只关注有意思的题目。基础包括——

各种排序算法
基础数据结构和算法的实现:堆、二叉树、图
基础数据结构的使用:链表、栈、队列、哈希表、图、Trie、并查集…
基础算法:深度优先、广度优先、二分查找、递归…
基本算法思想:递归、分治、回溯搜索、贪心、动态规划…

选择合适的OJ:OJ(online judge 在线判题系统)——不要选择过于偏向程序设计竞赛的OJ。建议首选LeetCode(来源于真实的面试问题)、以HackerRank(对问题的分类很详细)为辅。

学习和实践做题之间要平衡好。

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

1.注意题目中的条件