大厂笔试面试,你必须会哪些经典算法题目?
首先,强烈建议采用“题海战术”。
我今年面了数十家公司,90%的题目是原题(没办法,就那几个知识点,能有什么新题)。
题库在哪里呢?
- leetcode。
程序员刷面试题的第一网站,题多且全,少部分题目收费。刷的人很多,答案非常好找。
online judge能深度检验代码的正确性,刷leetcode是最能锻炼算法题能力的。假如说时间有限只能刷一个,那必须是leetcode,假如时间够多……lintcode、meetqun等各大面试题OJ欢迎你,此外还有许多国内外大学的OJ。
以上是两大主力,但是光这两个,还不能到“题海”的水平,而且由于它们名气太响,有些公司有时会避开里面的题目……来,我们继续找题目。
- 编程之美、剑指offer
就当成两本习题集好了,里面有些题目和1、2重复,但是大部分题目还是很优秀很巧妙的。重点是交叉对比,你就知道哪些是经典题目了。
相信看到这个问题的人一定是想冲刺大厂面试,或至少是想进入互联网行业的。
那么在你开始刷算法题之前,我想问:算法基础知识,你都熟悉了吗?
如果你对这些知识点还一知半解,那我强烈建议你先去夯实一遍基础知识,还没有把概念弄清楚就去看题刷题,不仅事倍功半,而且刷题的过程会非常非常痛苦(别问我是怎么知道的)。
我还整理了国内算法面试中的常考知识点:
直接看图,颜色越深,说明考到的次数越多,应该重点掌握。
至于常考知识点的考察频率和难度,我也帮你整理好了。
很多人为了应付算法面试刷了很多题,但到了面试中还是频频挂面,主要原因是刷题仅停留在表面,一旦题目出现简单变形就无法反应过来,遇到新题更是不知道所考察的是哪个知识点,该用哪种解法来答题。
而要解决这一问题的方案也很简单:将刷题获得的知识点形成系统的知识体系,这就是靠刷题很难达成的,除了日常积累外还需要在刷题中有自己独立的思考和总结。
大厂面试 高频 数据结构 & 算法题 【top 100】 大汇总
其中 ⭐ 个数表示出现频率高低
一、 排序算法 & 查找 & top k
\1. 快速排序
\2. 堆排序
\4. 【LeetCode】215. 数组中的第K个最大元素 ⭐⭐⭐)
\5. 【LeetCode】347. 前 K 个高频元素 )
\6. 【leetCode】704. 二分查找)
二、二叉树
\0. 【LeetCode】二叉树各种遍历大汇总(秒杀前序、中序、后序、层序 )递归 & 迭代 ⭐⭐⭐⭐⭐)
\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(双指针 中学追及问题) ⭐)
\3. 【LeetCode 】234. 回文链表)
\5. 【LeetCode 】19. 删除链表的倒数第N个节点)
\7. 【LeetCode】83. 删除排序链表中的重复元素(保留或者不保留))
\8. 【LeetCode】2. 两数相加(链表逆序存储 & 445. 两数相加 II(链表正序: 栈))
\9. 【LeetCode】21. 合并两个有序链表(简单) ⭐⭐)
\10. 【LeetCode】23. 合并K个排序链表(困难))
\11. 【LeetCode】25. K 个一组翻转链表 ⭐⭐⭐)
四、数 & 数组 & 矩形 & 指针
\1. 【LeetCode】84. 柱状图中最大的矩形(单调栈))
\3. 【LeetCode】33. 搜索旋转排序数组(查找目标值) ⭐⭐ & 189. 旋转数组 (将数组中的元素向右移动 k 个位置))
\4. 【剑指 Offer】 29. 顺时针打印矩阵 (与 54. 螺旋矩阵 相同))
\5. 【LeetCode】4. 寻找两个正序数组的中位数【困难】)
\7. 【leetCode】15. 三数之和 = 0(排序 + 双指针)⭐⭐ & 1.两数之和 = target ⭐⭐ )
\9. 【LeetCode】88. 合并两个有序数组 ⭐⭐)
\10. 【LeetCode】7. 整数反转)
\11. 【LeetCode】11.盛最多水的容器(数组+双指针)
\12. 【LeetCode】26.删除排序数组中的重复项目(数组+双指针)
\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背包问题详解
\3. 【LeetCode 】213. 打家劫舍II )
\4. 【LeetCode 】416. 分割等和子集(使得两个子集的元素和相等))
\5. 【LeetCode 】494. 目标和 ( + 和 - 操作得到 target))
\6. LeetCode 】279. 完全平方数(最少的完全平方数之和等于 n))
\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. 无重复字符的最长子串 ⭐⭐⭐)
\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. 只出现一次的数字(异或运算秒杀))
\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)
\5. [卷积、池化的作用和区别]