如果最近你出去面试,不管是大厂还是小的创业公司,最后都会问你几个算法题。看似不怎么实用的算法,成为很多面试者的拦路虎,那对于算法,我们应该怎么面对,又有没有好的方法在短期内提升算法的解题能力呢?
对于这个问题,很难给出明确的答复。首先,算法确实很重要,它能将你和普通的程序员区分开来,助你拿到⼤⼚的 Offer。其次,算法更多的好处是隐性的、潜移默化的,会给你带来很多隐形的好处。很多时候,公司在招人的时候,会要求面试者除了经验丰富之外,还要求技术要好,基础扎实,熟练掌握算法和数据结构,这时候算法面试就显得尤为重要。
比如,我之前去面试过BAT、字节等大厂,到第二面一般都会问你一些算法题目,按照他们的说法,为什么要考算法呢?其实就是想看候选⼈是不是⾜够聪明。那如何看候选人是否聪明呢,那就是算法。在大厂的算法考核中,⼀般会分两步,第⼀步是直接让你说思路,第⼆
步是让你直接上⼿写代码。我之前面试过字节跳动的算法题,就是直接上手些代码,并且要能够运行成功,算法的难度⼀般不会太高,对应的大多数是 LeetCode 中级模式,所以如果你准备面试这些大厂,花时间学习算法是非常必要的。
很多技术⼤⽜都说过一句话,那就是【程序 = 数据结构 + 算法】,在我看来这话⼀点也不虚。我们写代码并不仅仅是为了把代码写出来,让它能运⾏就可以了。我们真正的⽬的
是⽤代码将逻辑正确地表达出来,这就是我们学习数据结构和算法的意义。另一方面,我们的⽬的是学习算法背后的思维和逻辑,建⽴时间复杂度、空间复杂度意识,写出⾼质量的代码,能够设计基础架构,从⽽提升编程技能,训练逻辑思维,提⾼核⼼竞争⼒,以此获得更多的⼯作回报,让职业⽣涯⾛得更顺更远。
说到这⾥,可能有⼈会说,我也清楚算法的重要性,但算法太难学了,之前也多次尝试⾃
学,但是找不到⾼效的学习⽅法,很难坚持下去,有时就算明⽩算法的知识原理,做题的时
候却始终找不到最优解,等等。
我只能说,算法学习也是有⽅法的,如果想要学好,必须要掌握正确的学习⽅法,建⽴⾃⼰
的算法知识体系。对于大多数开发者来说,算法并不需要学习的多深,但是一些基本的数据结构,如数组、链表、栈、队列、散列表、二叉树、堆、跳表、图、Trie 树;以及一些基本的算法:递归、排序、二分查找、搜索、哈希算法、贪心算法、分治算法、回溯算法、动态规划、字符串匹配算法等还是需要掌握的,如下图所示。
掌握了这些基础的数据结构和算法,再学更加复杂的数据结构和算法,就会非常容易,下面是五分钟学算法大佬收集的一些常见算法题,当然网上也有很多LeetCode的算法笔记。
1、复杂度分析
2、基本算法思想
- 五分钟了解一下什么是「贪心算法 」
- 有了四步解题法模板,再也不害怕动态规划!
- (进阶版)有了四步解题法模板,再也不害怕动态规划!
- (再进阶版)有了四步解题法模板,再也不害怕动态规划!
- 浅谈什么是分治算法
- 看动画轻松理解「递归」与「动态规划」
- 浅谈什么是动态规划以及相关的「股票」算法题
- 深度解析「正则表达式匹配」:从暴力解法到动态规划
3、排序算法
4、搜索
5、查找算法
6、字符串匹配
7、线性表
- 如何高效对有序数组/链表去重?
- 超详细!详解一道高频算法题:数组中的第 K 个最大元素
- 一道简单的数组遍历题,加上四个条件后感觉无从下手
- 数组特性的妙用!如何找到「缺失的第一个正数」
- 剑指 offer 第一题:二维数组中的查找
- 什么是单调栈?
- 在数据结构中穿针引线:链表实现栈和队列
- 从简单的线性数据结构开始:栈与队列
- 五分钟学算法小知识:用栈实现队列/用队列实现栈
- 几道和「堆栈、队列」有关的面试算法题
- 超详细!图解「合并 K 个排序链表」
- 动画:面试如何轻松手写链表?
- LeetCode 上最难的链表算法题,没有之一!
- 链表算法面试问题?看我就够了!
- 看动画轻松理解「链表」实现「LRU缓存淘汰算法」
- 从简单的线性数据结构开始:穿针引线的链表(一)
- 在数据结构中穿针引线:链表实现栈和队列
8、散列表
9、树
- 面试前准备:二叉树高频面试题和答案
- 懵逼树上懵逼果:学习二分搜索树
- LeetCode 二叉树问题小总结
- 从简单二叉树问题重新来看深度优先搜索
- 几道和「二叉树」有关的算法面试题
- 详解什么是平衡二叉树(AVL)(修订补充版)
- 【面试现场】为什么 MySQL 数据库要用B+树存储索引?
面试官:为什么 MySQL 的索引要使用 B+ 树,而不是其它树?比如 B 树?
10、图
总的来说,数据结构和算法可以有效的提升一个一个人的思维训练的过程,并且学习算法是一个持续的过程,所以需要做到持之以恒。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。