前端算法题精选(LeetCode)
来自:小麦
⚠️ 注意:下面出现的序号对应 LeetCode 题目序号
🔗 官方中文版:https://leetcode.cn/problemset/
🆓 社区免费版:https://leetcode.doocs.org/lc/1/
💡刷题策略
先基础、再进阶;先 JavaScript 再其他。
自己做 > 真人题解 > AI 题解。
集中时间分类刷题:比如一周数组、一周栈、一周树等等。
前端用 JS/TS 语言写。
📌 分类与优先级
⭐⭐⭐ 必须掌握
JavaScript - 前端核心,必须全部掌握
数组 - 基础数据结构,高频考点
字符串 - 前端常见场景
哈希表 - 数据查找与缓存
⭐⭐ 重要掌握
栈 - 浏览器历史、表达式求值
队列 - 异步任务、事件循环
链表 - 数据结构基础
树/二叉树 - DOM 树理解
⭐ 进阶掌握
双指针 - 算法优化技巧
动态规划 - 算法思维训练
1.JavaScript(最重要)
这是前端面试的绝对核心,涵盖闭包、异步、函数式编程、设计模式等关键概念
🔥 基础入门
2667. 创建 Hello World 函数 - 函数基础
2703. 返回传递的参数的长度 - 参数处理
2704. 相等还是不相等 - 类型判断
🔥 闭包与作用域
2620. 计数器 - 闭包入门
2665. 计数器 II - 闭包进阶
2666. 只允许一次函数调用 - 闭包应用
🔥 异步编程(重点)
2621. 睡眠函数 - Promise 基础
2637. 有时间限制的 Promise 对象 - Promise 超时
2721. 并行执行异步函数 - Promise.all
2723. 两个 Promise 对象相加 - Promise 组合
2715. 执行可取消的延迟函数 - 取消机制
2725. 间隔取消 - setInterval 控制
2650. 设计可取消函数 - 取消模式
🔥 性能优化
2622. 有时间限制的缓存 - 缓存机制
2623. 记忆函数 - Memoization
2630. 记忆函数 II - 高级缓存
2627. 函数防抖 - Debounce
2676. 节流 - Throttle
🔥 函数式编程
2629. 复合函数 - 函数组合
2632. 柯里化 - Currying
2797. 带有占位符的部分函数 - Partial Application
🔥 数组方法实现
2634. 过滤数组中的元素 - filter 实现
2635. 转换数组中的每个元素 - map 实现
2626. 数组归约运算 - reduce 实现
2625. 扁平化嵌套数组 - flat 实现
2677. 分块数组 - chunk 实现
2804. 数组原型的 forEach 方法 - forEach 实现
🔥 对象操作
2693. 使用自定义上下文调用函数 - this 绑定/call/apply
2754. 将函数绑定到上下文 - bind 实现
2700. 两个对象之间的差异 - 对象比较
2705. 精简对象 - 对象过滤
2722. 根据 ID 合并两个数组 - 数据合并
2755. 深度合并两个对象 - 深度合并
2727. 判断对象是否为空 - 对象判断
2633. 将对象转换为 JSON 字符串 - JSON 序列化
🔥 设计模式
2694. 事件发射器 - 发布订阅模式
2726. 使用方法链的计算器 - 链式调用
2695. 包装数组 - 包装器模式
🔥 生成器与迭代器
2648. 生成斐波那契数列 - Generator
2649. 嵌套数组生成器 - 嵌套迭代
2803. 阶乘生成器 - Generator 应用
🔥 其他重要题目
2618. 检查是否是类的对象实例 - instanceof
2619. 数组原型对象的最后一个元素 - 原型链
2628. 完全相等的 JSON 字符串 - 深度比较
2631. 分组 - groupBy 实现
2724. 排序方式 - 自定义排序
2776. 转换回调函数为 Promise 函数 - Promisify
2. 数组(Array)
数组是前端开发最常用的数据结构,必须熟练掌握
🔥 基础
1. 两数之和 - 哈希表经典
26. 删除有序数组中的重复项 - 双指针
27. 移除元素 - 数组原地修改
66. 加一 - 数组模拟
88. 合并两个有序数组 - 归并思想
217. 存在重复元素 - 哈希表基础
283. 移动零 - 双指针经典
🔥 进阶
53. 最大子数组和 - 动态规划/贪心
121. 买卖股票的最佳时机 - 贪心算法
122. 买卖股票的最佳时机 II - 贪心
136. 只出现一次的数字 - 位运算
169. 多数元素 - 摩尔投票
189. 轮转数组 - 数组旋转技巧
238. 除自身以外数组的乘积 - 前缀积
268. 丢失的数字 - 数学/位运算
🔥 高频算法题
15. 三数之和 - 双指针经典
16. 最接近的三数之和 - 双指针
18. 四数之和 - 双指针
56. 合并区间 - 区间问题
57. 插入区间 - 区间合并
118. 杨辉三角 - 二维数组
119. 杨辉三角 II - 空间优化
3. 哈希表(Hash Table)
前端开发中常用于数据查找、去重、缓存等场景
🔥 基础
1. 两数之和 - 入门必做
217. 存在重复元素 - 基础去重
219. 存在重复元素 II - 滑动窗口+哈希
242. 有效的字母异位词 - 字符统计
349. 两个数组的交集 - 集合操作
350. 两个数组的交集 II - 哈希计数
387. 字符串中的第一个唯一字符 - 字符频率
383. 赎金信 - 字符统计
🔥 进阶
49. 字母异位词分组 - 哈希分组
128. 最长连续序列 - 哈希优化
136. 只出现一次的数字 - 位运算/哈希
205. 同构字符串 - 双向映射
290. 单词规律 - 模式匹配
454. 四数相加 II - 哈希优化
🔥 设计题
146. LRU 缓存 - 缓存淘汰机制(必做)
380. O(1) 时间插入、删除和获取随机元素 - 数据结构设计
460. LFU 缓存 - 复杂缓存设计
705. 设计哈希集合 - 哈希表实现
706. 设计哈希映射 - 哈希表实现
4. 字符串(String)
字符串处理是前端开发的常见场景
🔥 基础
14. 最长公共前缀 - 字符串比较
28. 找出字符串中第一个匹配项的下标 - KMP/暴力
58. 最后一个单词的长度 - 字符串遍历
125. 验证回文串 - 双指针
344. 反转字符串 - 双指针基础
345. 反转字符串中的元音字母 - 双指针
383. 赎金信 - 字符统计
387. 字符串中的第一个唯一字符 - 哈希表
🔥 进阶
3. 无重复字符的最长子串 - 滑动窗口经典
5. 最长回文子串 - 动态规划/中心扩展
8. 字符串转换整数 (atoi) - 边界处理
151. 反转字符串中的单词 - 字符串处理
242. 有效的字母异位词 - 排序/哈希
415. 字符串相加 - 大数加法
443. 压缩字符串 - 双指针
20. 有效的括号 - 栈的应用
49. 字母异位词分组 - 哈希分组
76. 最小覆盖子串 - 滑动窗口
394. 字符串解码 - 栈/递归
438. 找到字符串中所有字母异位词 - 滑动窗口
5. 栈(Stack)
栈在前端有广泛应用:浏览器历史、表达式求值、括号匹配等
🔥 基础
20. 有效的括号 - 栈的经典应用(必做)
155. 最小栈 - 辅助栈设计
225. 用队列实现栈 - 数据结构转换
232. 用栈实现队列 - 数据结构转换
844. 比较含退格的字符串 - 栈模拟
🔥 进阶
71. 简化路径 - 路径处理
150. 逆波兰表达式求值 - 后缀表达式
224. 基本计算器 - 表达式求值
227. 基本计算器 II - 运算符优先级
394. 字符串解码 - 嵌套结构
496. 下一个更大元素 I - 单调栈
503. 下一个更大元素 II - 单调栈
739. 每日温度 - 单调栈经典
🔥 设计题
716. 最大栈 - 栈的扩展设计
1472. 设计浏览器历史记录 - 双栈/链表
6. 队列(Queue)
队列在异步编程和任务调度中常用
🔥 基础
225. 用队列实现栈 - 数据结构实现
232. 用栈实现队列 - 数据结构实现
933. 最近的请求次数 - 队列应用
🔥 进阶
239. 滑动窗口最大值 - 单调队列
346. 数据流中的移动平均值 - 队列+滑动窗口
622. 设计循环队列 - 循环队列实现
641. 设计循环双端队列 - 双端队列实现
7. 链表(Linked List)
虽然前端较少直接使用,但是考察数据结构理解的重要题型
🔥 基础
21. 合并两个有序链表 - 归并思想
83. 删除排序链表中的重复元素 - 链表遍历
141. 环形链表 - 快慢指针
160. 相交链表 - 双指针
203. 移除链表元素 - 链表删除
206. 反转链表 - 必会经典题
234. 回文链表 - 快慢指针+反转
237. 删除链表中的节点 - 特殊删除
🔥 进阶
2. 两数相加 - 链表模拟加法
19. 删除链表的倒数第 N 个结点 - 双指针
24. 两两交换链表中的节点 - 链表操作
61. 旋转链表 - 链表旋转
82. 删除排序链表中的重复元素 II - 链表删除
86. 分隔链表 - 链表分割
92. 反转链表 II - 部分反转
142. 环形链表 II - 快慢指针
143. 重排链表 - 综合操作
148. 排序链表 - 归并排序
328. 奇偶链表 - 链表重组
🔥 设计题
707. 设计链表 - 链表实现
146. LRU 缓存 - 双向链表+哈希
8. 树(Tree)/ 二叉树
DOM 树的理解基础,递归思想的训练
🔥 基础
94. 二叉树的中序遍历 - 递归/迭代
102. 二叉树的层序遍历 - BFS
104. 二叉树的最大深度 - 递归基础
111. 二叉树的最小深度 - BFS/DFS
144. 二叉树的前序遍历 - 递归/迭代
145. 二叉树的后序遍历 - 递归/迭代
226. 翻转二叉树 - 递归经典
🔥 进阶
100. 相同的树 - 递归比较
101. 对称二叉树 - 递归/迭代
103. 二叉树的锯齿形层序遍历 - BFS 变体
107. 二叉树的层序遍历 II - BFS
110. 平衡二叉树 - 递归判断
112. 路径总和 - DFS
113. 路径总和 II - DFS 回溯
199. 二叉树的右视图 - BFS/DFS
236. 二叉树的最近公共祖先 - 递归
257. 二叉树的所有路径 - DFS
404. 左叶子之和 - DFS
437. 路径总和 III - DFS
543. 二叉树的直径 - 递归
617. 合并二叉树 - 递归
9. 动态规划(DP)
部分前端面试会考察算法思维
🔥 基础
70. 爬楼梯 - DP 入门
118. 杨辉三角 - 二维 DP
121. 买卖股票的最佳时机 - 状态机 DP
198. 打家劫舍 - 线性 DP
509. 斐波那契数 - DP 基础
🔥 进阶
5. 最长回文子串 - 区间 DP
53. 最大子数组和 - 经典 DP
62. 不同路径 - 二维 DP
63. 不同路径 II - 二维 DP
64. 最小路径和 - 二维 DP
91. 解码方法 - 线性 DP
120. 三角形最小路径和 - 二维 DP
139. 单词拆分 - DP+哈希
152. 乘积最大子数组 - 状态 DP
213. 打家劫舍 II - 环形 DP
221. 最大正方形 - 二维 DP
279. 完全平方数 - 完全背包
300. 最长递增子序列 - 经典 DP
322. 零钱兑换 - 完全背包
416. 分割等和子集 - 0-1 背包
10. 双指针(Two Pointers)
前端开发中常用的算法优化技巧
🔥 对撞指针
11. 盛最多水的容器 - 贪心+双指针
15. 三数之和 - 排序+双指针
16. 最接近的三数之和 - 双指针
18. 四数之和 - 双指针
167. 两数之和 II - 有序数组双指针
344. 反转字符串 - 对撞指针
🔥 快慢指针
26. 删除有序数组中的重复项 - 快慢指针
27. 移除元素 - 快慢指针
80. 删除有序数组中的重复项 II - 快慢指针
141. 环形链表 - 快慢指针
142. 环形链表 II - 快慢指针
283. 移动零 - 快慢指针
876. 链表的中间结点 - 快慢指针
🔥 滑动窗口
3. 无重复字符的最长子串 - 滑动窗口经典
76. 最小覆盖子串 - 滑动窗口
209. 长度最小的子数组 - 滑动窗口
438. 找到字符串中所有字母异位词 - 滑动窗口
567. 字符串的排列 - 滑动窗口