这里记录了后端面试中常考的算法与数据结构题目(建议搭配 LeetCode 刷题):
经典数据结构
- 数组和链表的区别是什么?
- 栈(Stack)和队列(Queue)的区别?如何用两个栈实现一个队列?
- 什么是哈希表(Hash Table)?如何解决哈希冲突(拉链法、开放寻址法)?
- 什么是二叉搜索树(BST)、平衡二叉树(AVL)和红黑树?
- 什么是堆(Heap)?大顶堆和小顶堆的应用场景?
- 什么是图(Graph)?深度优先搜索(DFS)和广度优先搜索(BFS)的区别?
常见排序与查找算法
- 手写快速排序(Quick Sort),它的时间复杂度和空间复杂度是多少?
- 手写归并排序(Merge Sort)。
- 什么是堆排序(Heap Sort)?
- 手写二分查找(Binary Search),以及它的变体(找第一个大于等于目标值的元素等)。
高频手撕代码题 (LeetCode)
- 链表:反转链表(单链表反转、K个一组反转)、判断链表是否有环、合并两个有序链表。
- 树:二叉树的前序/中序/后序遍历(递归与非递归实现)、二叉树的层序遍历、二叉树的最大深度、最近公共祖先。
- 双指针/滑动窗口:无重复字符的最长子串、三数之和、接雨水、盛最多水的容器。
- 栈与队列:有效的括号、最小栈、滑动窗口最大值。
- 动态规划 (DP):爬楼梯、打家劫舍、最长递增子序列(LIS)、最长公共子序列(LCS)、背包问题、零钱兑换。
- 回溯算法:全排列、组合总和、N 皇后问题。
- 贪心算法:买卖股票的最佳时机、跳跃游戏。
场景与高级算法
- 如何实现一个 LRU(最近最少使用)缓存淘汰算法?(哈希表 + 双向链表)
- 如何实现一个 LFU 缓存淘汰算法?
- 海量数据处理:如何在 10 亿个数中找出 Top K 大的数?(分治 + 最小堆 / 快速选择)
- 海量数据处理:如何判断一个元素是否存在于百亿数据中?(布隆过滤器 Bloom Filter)
- 字符串匹配算法:手写 KMP 算法。
- 一致性 Hash 算法的代码实现思路。