大厂笔试面试,你必须会哪些经典算法题目?

首先,强烈建议采用“题海战术”。

我今年面了数十家公司,90%的题目是原题(没办法,就那几个知识点,能有什么新题)。

题库在哪里呢?

  1. leetcode。

程序员刷面试题的第一网站,题多且全,少部分题目收费。刷的人很多,答案非常好找。

online judge能深度检验代码的正确性,刷leetcode是最能锻炼算法题能力的。假如说时间有限只能刷一个,那必须是leetcode,假如时间够多……lintcode、meetqun等各大面试题OJ欢迎你,此外还有许多国内外大学的OJ。

以上是两大主力,但是光这两个,还不能到“题海”的水平,而且由于它们名气太响,有些公司有时会避开里面的题目……来,我们继续找题目。

  1. 编程之美、剑指offer

就当成两本习题集好了,里面有些题目和1、2重复,但是大部分题目还是很优秀很巧妙的。重点是交叉对比,你就知道哪些是经典题目了。

算法学习方略 - 图1

相信看到这个问题的人一定是想冲刺大厂面试,或至少是想进入互联网行业的。

那么在你开始刷算法题之前,我想问:算法基础知识,你都熟悉了吗?

如果你对这些知识点还一知半解,那我强烈建议你先去夯实一遍基础知识,还没有把概念弄清楚就去看题刷题,不仅事倍功半,而且刷题的过程会非常非常痛苦(别问我是怎么知道的)。

我还整理了国内算法面试中的常考知识点:

算法学习方略 - 图2

直接看图,颜色越深,说明考到的次数越多,应该重点掌握。

至于常考知识点的考察频率和难度,我也帮你整理好了。

算法学习方略 - 图3

很多人为了应付算法面试刷了很多题,但到了面试中还是频频挂面,主要原因是刷题仅停留在表面,一旦题目出现简单变形就无法反应过来,遇到新题更是不知道所考察的是哪个知识点,该用哪种解法来答题。

而要解决这一问题的方案也很简单:将刷题获得的知识点形成系统的知识体系,这就是靠刷题很难达成的,除了日常积累外还需要在刷题中有自己独立的思考和总结。

大厂面试 高频 数据结构 & 算法题 【top 100】 大汇总

其中 ⭐ 个数表示出现频率高低

一、 排序算法 & 查找 & top k

\1. 快速排序

\2. 堆排序

\3. 【剑指 Offer】 40. 最小的k个数)

\4. 【LeetCode】215. 数组中的第K个最大元素 ⭐⭐⭐)

\5. 【LeetCode】347. 前 K 个高频元素 )

\6. 【leetCode】704. 二分查找)

二、二叉树

\0. 【LeetCode】二叉树各种遍历大汇总(秒杀前序、中序、后序、层序 )递归 & 迭代 ⭐⭐⭐⭐⭐)

\1. 【LeetCode】572. 另一个树的子树)

\2. 【LeetCode】104. 二叉树的最大深度 ⭐⭐)

\3. 【LeetCode】124. 二叉树中的最大路径和(困难) ⭐⭐)

\4. 【LeetCode】543. 二叉树的直径(任意两节点间最大长度) ⭐⭐)

\5. 【LeetCode】110. 平衡二叉树 ⭐⭐](https://link.zhihu.com/?target=https%3A//blog.csdn.net/weixin_41888257/article/details/107136650))

\6. 【LeetCode】297. 二叉树的序列化与反序列化)

\7. 【LeetCode】226.翻转二叉树 (同 : 剑指 Offer 27. 二叉树的镜像) ⭐⭐](https://link.zhihu.com/?target=https%3A//blog.csdn.net/weixin_41888257/article/details/107144320))

\8. 【LeetCode】235. 二叉搜索树的最近公共祖先)

\9. 【LeetCode】236. 二叉树的最近公共祖先 ⭐⭐(普通二叉树,不一定是二叉搜索树))

\10. 【LeetCode】103. 二叉树的锯齿形层次遍历)

\11. 【LeetCode】814. 二叉树剪枝)

\12. 【LeetCode】199. 二叉树的右视图 ⭐⭐)

\13. 【LeetCode】112. 路径总和 ⭐⭐(二叉树是否存在和为 target的路径) & 113. 路径总和 II ⭐(找到所有满足的路径)& 437. 路径总和 III)

\14. [【LeetCode】958. 二叉树的完全性检验 ⭐⭐]

三、链表

\1. 【LeetCode】141 环形链表 I, ⭐ 142. 环形链表 II(双指针 中学追及问题) ⭐)

\2. 【LeetCode 】160. 相交链表 ⭐⭐)

\3. 【LeetCode 】234. 回文链表)

\4. 【LeetCode 】876. 链表的中间结点)

\5. 【LeetCode 】19. 删除链表的倒数第N个节点)

\6. 【LeetCode】206. 反转链表 ⭐⭐)

\7. 【LeetCode】83. 删除排序链表中的重复元素(保留或者不保留))

\8. 【LeetCode】2. 两数相加(链表逆序存储 & 445. 两数相加 II(链表正序: 栈))

\9. 【LeetCode】21. 合并两个有序链表(简单) ⭐⭐)

\10. 【LeetCode】23. 合并K个排序链表(困难))

\11. 【LeetCode】25. K 个一组翻转链表 ⭐⭐⭐)

四、数 & 数组 & 矩形 & 指针

\1. 【LeetCode】84. 柱状图中最大的矩形(单调栈))

\2. 【LeetCode】85. 最大矩形(hard))

\3. 【LeetCode】33. 搜索旋转排序数组(查找目标值) ⭐⭐ & 189. 旋转数组 (将数组中的元素向右移动 k 个位置))

\4. 【剑指 Offer】 29. 顺时针打印矩阵 (与 54. 螺旋矩阵 相同))

\5. 【LeetCode】4. 寻找两个正序数组的中位数【困难】)

\6. 【LeetCode】41. 缺失的第一个正数)

\7. 【leetCode】15. 三数之和 = 0(排序 + 双指针)⭐⭐ & 1.两数之和 = target ⭐⭐ )

\8. 【LeetCode】16.最接近目标和的三数之和

\9. 【LeetCode】88. 合并两个有序数组 ⭐⭐)

\10. 【LeetCode】7. 整数反转)

\11. 【LeetCode】11.盛最多水的容器(数组+双指针)

\12. 【LeetCode】26.删除排序数组中的重复项目(数组+双指针)

\13. 【LeetCode】46.全排列(回溯算法)

\14. 【LeetCode】287.寻找重复数

\15. 【LeetCode】166. 分数到小数)

\16. 【LeetCode】842. 将数组拆分成斐波那契序列(回溯))

\17. [【LeetCode】209. 长度最小的子数组 ⭐⭐]

五、DFS、BFS、栈、队列

\1. 【LeetCode】200. 岛屿数量 ⭐⭐⭐& 695.岛屿最大面积)

\2. 【LeetCode】155. 最小栈 (使用辅助栈)& 面试题 03.05. 栈排序 (手写 push、pop ))

\3. [【剑指offer】09. 用两个栈实现队列 ⭐]

六、动态规划 & 序列 & 串

\0. 【LeetCode】509. 斐波那契数)

\1. 0-1背包问题详解

\2. 【LeetCode】 300. 最长上升子序列)

\3. 【LeetCode 】213. 打家劫舍II )

\4. 【LeetCode 】416. 分割等和子集(使得两个子集的元素和相等))

\5. 【LeetCode 】494. 目标和 ( + 和 - 操作得到 target))

\6. LeetCode 】279. 完全平方数(最少的完全平方数之和等于 n))

\7. 【LeetCode】62. 不同路径(动态规划))

\8. LeetCode】63. 不同路径 II(有障碍物时)(动态规划))

\9. 【LeetCode】121. 买卖股票的最佳时机 ⭐⭐)

\10. 【LeetCode】53.最大子序和

\11. 【LeetCode】673.最长递增子序列的个数(可不连续)& 674. 最长递增子序列的长度)

\12. [【LeetCode】322. 零钱兑换 ⭐⭐]

\13. [【LeetCode】128. 最长连续序列 ⭐⭐]

七、字符串

\1. No. 1143 【LintCode 最长AB子串 O(N)复杂度 解法】复杂度 解法】](https://link.zhihu.com/?target=https%3A//blog.csdn.net/weixin_41888257/article/details/103895199))

\2. 【LeetCode】3. 无重复字符的最长子串 ⭐⭐⭐)

\3. 【LeetCode】394. 字符串解码 ⭐⭐)

\4. 【LeetCode】8. 字符串转换整数 (atoi)](https://link.zhihu.com/?target=https%3A//blog.csdn.net/weixin_41888257/article/details/105164884))

\5. [【LeetCode】344. 反转字符串 ⭐]

九、位运算 & CPU逻辑等

\1. 【LeetCode】231. 2的幂 ——判断一个数是不是2的整数次幂](https://link.zhihu.com/?target=https%3A//blog.csdn.net/weixin_41888257/article/details/106963279))

\2. 【LeetCode】136. 只出现一次的数字(异或运算秒杀))

\3. 【剑指 Offer】 15. 二进制中1的个数)

\4. 【LeetCode】636. 函数的独占时间)

\5. 【LeetCode】146. LRU缓存机制 ⭐⭐)

八、结合项目(逻辑回归、SVM、FFT等)

\1. 【超详细公式推导】关于交叉熵损失函数(Cross-entropy)和 平方损失(MSE)的区别)

\2. 李宏毅深度强化学习笔记(一)Proximal Policy Optimization (PPO)](https://link.zhihu.com/?target=https%3A//blog.csdn.net/weixin_41888257/article/details/104812269))

\3. 李宏毅深度强化学习笔记(二)Imitation Learning)

\4. 傅里叶变换公式及其推导【超详细!】

\5. [卷积、池化的作用和区别]

\6. BN和Dropout在训练和测试时的差别 ⭐⭐⭐⭐⭐