程序员必须掌握哪些算法?附“互联网公司最常见的算法面试题”

程序员必须掌握哪些算法?附“互联网公司最常见的算法面试题”

春招在即,不知道小伙伴们为面试准备得怎么样啦?

力扣 在此特地为大家整理了一些程序员在 面试中 需要掌握的算法,熟练掌握它们可以帮你在面试中如虎添翼,百战百胜。

01 算法与数据结构

算法与数据结构是面试考察的重中之重,也是同学们日后刷题时需要着重训练的部分。简单的总结一下,大约有这些内容:

算法 - Algorithms

  1. 排序算法:快速排序、归并排序、计数排序
  2. 搜索算法:回溯、递归、剪枝技巧
  3. 图论:最短路、最小生成树、网络流建模
  4. 动态规划:背包问题、最长子序列、计数问题
  5. 基础技巧:分治、倍增、二分、贪心

数据结构 - Data Structures

  1. 数组与链表:单 / 双向链表、跳舞链
  2. 栈与队列
  3. 树与图:最近公共祖先、并查集
  4. 哈希表
  5. 堆:大 / 小根堆、可并堆
  6. 字符串:字典树、后缀树

02 经典面试题目

此外,我们还为大家整理了一些互联网公司面试常见的 算法题目

首先,让我们回顾几个有意思的经典互联网公司的面试题目,热热身。

一、给你一个长度为 n 的数组,其中只有一个数字出现了奇数次,其他均出现偶数次,问如何使用优秀的时空复杂度快速找到这个数字。

136. 只出现一次的数字

Loading...leetcode-cn.com图标

二、给你一个长度为 n 的数组,其中只有一个数字出现了大于等于 n/2 次,问如何使用优秀的时空复杂度快速找到这个数字。

169. 求众数

Loading...leetcode-cn.com图标

三、给你一个 n*m 的二维数组,每行元素保证递增,每列元素保证递增,试问如何使用优秀的时间复杂度找到某个数字(或者判断不存在)。

240. 搜索二维矩阵 II

Loading...leetcode-cn.com图标

四、给你两颗二叉搜索树,如何使用线性的时间复杂度,将它们合并成一颗二叉搜索树。

88.合并两个有序数组

Loading...leetcode-cn.com图标

五、假设有 100 层的高楼,给你两个完全一样的鸡蛋。请你设计一种方法,能够试出来从第几层楼开始往下扔鸡蛋,鸡蛋会碎。当然,这个问题还有推广版本,有兴趣的同学可以思考一下。假设有 n 层楼,给你 k 个完全一样的鸡蛋,请问最坏情况下,至少需要试验多少次才能知道从第几层楼开始往下扔鸡蛋,鸡蛋会碎。

887. 鸡蛋掉落

Loading...leetcode-cn.com图标


干货预警!

力扣Top Interview Questions 按照类别进行了整理,以供大家按模块练习。

详情请到力扣官网 “2018年力扣高频算法面试题汇总” 探索卡片进行专项练习。

探索算法面试题汇总 - 力扣 (LeetCode)leetcode-cn.com图标

03 面试题型汇总

作为在电话 / 现场面试中短短不到一个小时时间内,提供给面试者白板编程解决的算法题目,它与笔试上机、编程竞赛中的题目在难度与形式上还是有一些不同的。

这里有一张互联网公司面试中经常考察的问题类型总结的思维导图,我们可以结合图片中的信息分析一下。


可以明确的一点是,面试算法题目在难度上(尤其是代码难度上)会略低一些,倾向于考察一些基础数据结构与算法,对于高级算法和奇技淫巧一般不作考察。

代码题主要考察编程语言的应用是否熟练,基础是否扎实,一般来会让面试者写出代码完成一些简单的需求或者使用递归实现某些功能,而数学题倾向于考察概率相关的问题。以上这两类问题,出现的频率不会很高,即使出现了也应该是面试中的简单部分,相信一定难不倒在座的各位同学们。


04 算法的重要性

如果不谈面试的需求,对于程序员来说上面提到的那些算法依然非常重要,可以说上述内容都是 作为一个程序员必须掌握的算法

有人可能会觉得,这些基础的算法在工作中完全用不到,安安静静地做一个 CRUD Boy 多好。

其实不然,虽然同是程序员,程序员之间也是可以分出个三六九等的。

“一名出色的程序员一定是熟练掌握各种算法的。“ - 扎实地理解与掌握这些基础算法,能帮助你收获更强的竞争力,在自己的岗位上快速晋升。

那熟练掌握这些算法,到底可以为身为程序员的我们带来什么呢?

提升代码效率

比如,现在让你实现这样一个功能:给你一些有序的数字,动态地查找目标数字。实现这一功能的方法有很多种,当面临不同情况的时候,我们需要使用不同的方法。

  1. 查找频率很低时,对于每一次查询,暴力从前向后遍历,每次查询的复杂度为 O(N),能解决问题。
  2. 当查找频率很高时,对有序数字使用二分查找,每次查询复杂度为 O(logN)。或者使用哈希表,每次查询的复杂度为 O(1)。
  3. 如果数字非常多存不进内存里,可以使用 B树 的思路来优化查询。
  4. 当引入密集的插入操作,查询不太密集的时候,可以使用 LSM树 的思想完成这一功能。

如果你熟知各种基础算法,那么你就可以很容易地针对不同的场景找到合适的解决方案,并且将它们变成代码,以提升程序的效率。而不是遇事不决,先上暴力,虽然解决了问题,但是在时间与空间上还有很多不足。

提升能力、借鉴思路、获得启发

通过学习这些算法,可以提升我们在计算机方面的能力:抽象建模能力、逻辑思维能力等,并且积累一些解决问题的基本思路:折半、倍增、贪心、分治等。

现实中的问题都大相径庭,但是我们通过将其抽象并建模之后,会发现问题的本质是相似的,我们往往可能从某一个基础算法中获得启发,从而高效地解决问题。而达到这一境界,就要求我们首先对基础算法能非常了解,并达到熟练运用,融会贯通的地步。

所以,即使过了公司面试这一关,算法对于程序员来说依然是非常重要的。熟练掌握算法,将是你职场晋升路上的一把利刃。

最后,力扣祝大家刷题开心,拿到Dream Offer!


本文作者:力扣

声明:本文归 “力扣” 版权所有,如需转载请联系。

编辑于 2019-03-31

文章被以下专栏收录