跳到主要内容

算法与源码面试攻略

算法篇:投入产出比最大化

一个现实问题:要刷多少题?

网上流传的说法是"刷300道",但说实话,对于大多数人来说,这既不现实也没必要。

我的观点:刷题不在多,在于刷对+刷透。

150道高质量的题目 > 300道囫囵吞枣的题目

哪些题型ROI最高

ROI = 面试命中率 / 学习难度

推荐的刷题分配

题型建议数量理由
数组/字符串25-30题最基础,必考
链表15-20题经典题型,套路固定
二叉树20-25题高频,掌握遍历就成功一半
双指针/滑动窗口15-20题技巧性强,性价比高
动态规划25-30题难但高频,至少会基础的
BFS/DFS15-20题常和树、图结合考察
其他20-30题栈、队列、堆、哈希表等

总计150题左右,够用了。

刷题的正确姿势

错误姿势

  1. 看题 → 想不出来 → 看答案 → 抄一遍 → 下一题

这样刷100题和没刷差不多。

正确姿势

关键点:

  • 别在一道题上死磕太久
  • 看了答案要合上自己写一遍
  • 做完对比最优解
  • 隔几天要复习

高频题清单

这些题目面试出现概率极高,建议优先拿下:

数组/字符串

  • 两数之和
  • 三数之和
  • 无重复字符的最长子串
  • 最长回文子串

链表

  • 反转链表
  • 合并两个有序链表
  • 环形链表检测
  • 相交链表

二叉树

  • 二叉树遍历(前中后+层序)
  • 最大深度
  • 对称二叉树
  • 最近公共祖先

动态规划

  • 爬楼梯
  • 最大子数组和
  • 打家劫舍
  • 零钱兑换

手撕代码的注意事项

面试手撕代码和自己刷题不一样,有几个要注意的点:

  1. 先沟通再写:确认题意、问清边界条件
  2. 边写边解释:别闷头写,说出你在干什么
  3. 先写伪代码/框架:不要上来就扣细节
  4. 写完跑case:用简单例子过一遍

源码篇:学什么、怎么学

为什么要看源码

主要有两个原因:

面试加分:能从源码角度回答问题,段位瞬间不一样

实际收益:优秀源码里全是设计模式和最佳实践

但我想说的是:如果时间紧,源码的优先级低于算法和八股

源码学习的正确预期

别指望把一个框架的源码从头看到尾,那不现实。

正确做法是:带着问题看

比如:

  • Spring的Bean是怎么创建的?
  • MyBatis的SQL是怎么执行的?
  • HashMap为什么线程不安全?

每次只攻克一个问题,把这个点吃透就够了。

推荐的源码学习路径

第一阶段:JDK源码(入门)

重点看什么
HashMap数据结构、put流程、扩容机制
ArrayList扩容逻辑、和LinkedList的区别
ConcurrentHashMap分段锁、1.8的CAS优化
ThreadPoolExecutor核心参数、execute执行流程

第二阶段:Spring源码(进阶)

主题重点理解
IoC容器Bean的生命周期、依赖注入过程
AOP代理对象的创建时机、调用链路
事务@Transactional的实现原理
自动配置@EnableAutoConfiguration的加载机制

第三阶段:其他框架(选看)

根据你的项目和目标公司选择:

  • 用了MyBatis → 看MyBatis
  • 用了Dubbo → 看Dubbo
  • 面试喜欢问网络 → 看Netty

看源码的实用技巧

技巧1:从Demo入手

别直接扎进源码里,先写个最简单的使用示例,debug进去一步步看。

// 比如看HashMap源码,就从这行开始debug
Map<String, String> map = new HashMap<>();
map.put("key", "value");

技巧2:抓主干忽略细节

第一遍只看主流程,那些异常处理、边界判断先跳过。

技巧3:画调用流程图

边看边画,理清楚A调B、B调C的关系。

技巧4:对比不同版本

比如HashMap 1.7和1.8的区别,ConcurrentHashMap 1.7和1.8的区别。面试常问。

面试中怎么展示源码功底

不要背书式回答

HashMap底层是数组加链表,链表长度超过8转成红黑树...

这种答案面试官听太多了,没有区分度。

要有自己的理解

我看过HashMap的源码。put的时候先根据hashCode计算下标,如果hash冲突就用链表存。 1.8有个优化,链表长度超过8会转红黑树,因为链表太长查询效率就从O(1)退化成O(n)了。 但我有个疑问是为什么阈值是8,后来查了资料说是按泊松分布算的,正常情况下链表长度超过8的概率极小。

看出区别了吗?后者有理解、有思考、有深入。

时间紧迫时的取舍建议

如果你只有1个月准备时间:

优先级内容时间分配
P0高频算法题(100道)40%
P0核心八股文40%
P1项目准备15%
P2源码学习5%

源码放在最后,有余力再看。

如果你有3个月准备时间:

优先级内容时间分配
P0算法题(150道)30%
P0八股文系统学习30%
P1项目深度准备20%
P1源码学习20%

时间充裕的话,源码可以好好看看,面试确实能加不少分。