随着 Java 技术的发展,以及从业人员专业知识的不断提升,面试的难度也水涨船高越来越难了,所以八股也要与时俱进不断更新,这就是本篇文章诞生的目的之一。

我凭借自身的面试和被面试的经验,以及人工查阅并整理了牛某今年最新的 200 篇面经,总结了这篇文章,所以希望大家不要吝啬手中免费的赞,给作者点一波赞,谢谢了。

整理的部分面经展示:

一、最常见手撕代码题

  1. 链表判断是否有环(快手、美团、哈啰)
  2. 反转(区间)链表(猿辅导、美团)
  3. 合并两个有序链表(小米、滴滴、美团、蘑菇街)
  4. 二叉树遍历(快手、小米、小红书)
  5. 单例模式(快手面经多次出现)
  6. 手撕 LRU(滴滴、美团、阿里巴巴)
  7. 合并有序数组(美团)
  8. 快排(快手、百度)
  9. 两数之和(快手、滴滴、小米)
  10. 最长回文子串(小米、美团)
  11. 二叉树公共祖先(快手)

参考答案

1.链表判断是否有环

核心实现思路:使用快慢指针实现。 参考链接:https://www.nowcoder.com/practice/650474f313294468a4ded3ce0f7898b9open in new window

2.反转(区间)链表

核心实现思路:使用栈反转链表。 参考链接:https://www.nowcoder.com/practice/75e878df47f24fdc9dc3e400ec6058caopen in new window

3.合并两个有序链表

核心实现思路:使用递归或迭代的方式实现。 参考连接:https://leetcode.cn/problems/he-bing-liang-ge-pai-xu-de-lian-biao-lcof/solution/he-bing-liang-ge-pai-xu-de-lian-biao-by-g3z6g/open in new window

4.二叉树遍历

5.单例模式

双重效验锁的懒汉实现方式:

public class Singleton {
    private static volatile Singleton instance = null;
    private Singleton() {}
    public static Singleton getInstance() {
        if (instance == null) {
            synchronized (Singleton.class) {
            	if (instance == null) {
                	instance = new Singleton();
                }
            }
        }
        return instance;
    }
}

6.手撕 LRU

核心实现思路:哈希表 + 双向链表实现。 参考连接:https://leetcode.cn/problems/lru-cache/solution/lruhuan-cun-ji-zhi-by-leetcode-solution/open in new window

7.合并有序数组

核心实现思路:双指针,注意一般情况不能使用 Java 内置的方法,比如 Arrays.sort() 合并之后排序实现。 参考连接:https://leetcode.cn/problems/merge-sorted-array/solution/he-bing-liang-ge-you-xu-shu-zu-by-leetco-rrb0/open in new window

8.快排

参考连接:https://leetcode.cn/circle/article/kiHnKs/open in new window

9.两数之和

核心实现思路:使用暴力枚举或哈希表实现。 参考连接:https://leetcode.cn/problems/two-sum/solution/liang-shu-zhi-he-by-leetcode-solution/open in new window

10.最长回文子串

核心实现思路:贪心算法。 参考连接:https://leetcode.cn/problems/longest-palindrome/solution/zui-chang-hui-wen-chuan-by-leetcode-solution/open in new window

11.二叉树最近公共祖先

核心实现思路:遍历。 参考连接:https://leetcode.cn/problems/er-cha-sou-suo-shu-de-zui-jin-gong-gong-zu-xian-lcof/solution/er-cha-sou-suo-shu-de-zui-jin-gong-gong-0wpw1/open in new window

二、较常见手撕代码题

  1. 判断回文字符串:https://leetcode.cn/problems/valid-palindrome/solution/yan-zheng-hui-wen-chuan-by-leetcode-solution/open in new window
  2. 两个字符串的最大公共子字符串:https://leetcode.cn/problems/maximum-repeating-substring/solution/zui-da-zhong-fu-zi-zi-fu-chuan-by-leetco-r4cp/open in new window
  3. 有序链表转换二叉搜索树(快手):https://leetcode.cn/problems/convert-sorted-list-to-binary-search-tree/solution/you-xu-lian-biao-zhuan-huan-er-cha-sou-suo-shu-1-3/open in new window
  4. 两个栈实现队列(字节):https://leetcode.cn/problems/yong-liang-ge-zhan-shi-xian-dui-lie-lcof/solution/mian-shi-ti-09-yong-liang-ge-zhan-shi-xian-dui-l-3/open in new window
  5. 三个线程交替打印ABC(蔚来):https://www.javacn.site/interview/code/weilai_thread.htmlopen in new window
  6. 二分查找(阿里巴巴):https://leetcode.cn/problems/binary-search/solution/er-fen-cha-zhao-by-leetcode-solution-f0xw/open in new window