前端算法题精选(LeetCode)

来自:小麦

⚠️ 注意:下面出现的序号对应 LeetCode 题目序号

🔗 官方中文版:https://leetcode.cn/problemset/

🆓 社区免费版:https://leetcode.doocs.org/lc/1/

💡刷题策略

  • 先基础、再进阶;先 JavaScript 再其他。

  • 自己做 > 真人题解 > AI 题解。

  • 集中时间分类刷题:比如一周数组、一周栈、一周树等等。

  • 前端用 JS/TS 语言写。

📌 分类与优先级

⭐⭐⭐ 必须掌握

  1. JavaScript - 前端核心,必须全部掌握

  2. 数组 - 基础数据结构,高频考点

  3. 字符串 - 前端常见场景

  4. 哈希表 - 数据查找与缓存

⭐⭐ 重要掌握

  1. - 浏览器历史、表达式求值

  2. 队列 - 异步任务、事件循环

  3. 链表 - 数据结构基础

  4. 树/二叉树 - DOM 树理解

⭐ 进阶掌握

  1. 双指针 - 算法优化技巧

  2. 动态规划 - 算法思维训练


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. 字符串的排列 - 滑动窗口