以下是一份针对 Java 初/中级开发者 的 算法模拟练习清单,重点覆盖最常考、最有代表性的题型:
- 数组
- 链表
- 双指针 / 快慢指针
- 滑动窗口
- 二分查找
每类给出 3–5 道经典 LeetCode 题目(难度递增),附带核心思路提示 + Java 代码框架(不直接给完整解,留给你自己写 + debug 的空间)。
建议练习顺序:先暴力 → 再优化 → 最后写出 O(n) / O(log n) 解。
1. 数组基础 + 模拟
| 序号 | 题目名称 & 链接 | 难度 | 核心考察点 | 提示 / Java 框架思路 |
|---|---|---|---|---|
| 1 | 26. 删除有序数组中的重复项 | 简单 | 原地修改 + 双指针 | 快慢指针,慢指针记录有效位置 |
| 2 | 27. 移除元素 | 简单 | 原地修改 + 覆盖法 | 快慢指针 / 交换法 |
| 3 | 283. 移动零 | 简单 | 双指针 + 覆盖 | 类似 27,先把非零元素前移,最后补 0 |
| 4 | 189. 轮转数组 | 中等 | 数组翻转 / 环状替换 | 三次反转法 或 使用额外空间 |
| 5 | 48. 旋转图像 | 中等 | 矩阵原地旋转 | 先转置 + 每行翻转 |
练习目标:熟练掌握原地修改数组、不使用额外空间的技巧。
2. 链表基础 + 模拟
| 序号 | 题目名称 & 链接 | 难度 | 核心考察点 | 提示 / Java 框架思路 |
|---|---|---|---|---|
| 1 | 206. 反转链表 | 简单 | 迭代 / 递归 | 迭代三指针(prev、cur、next)最稳 |
| 2 | 21. 合并两个有序链表 | 简单 | 哑节点 + 归并 | 创建 dummy 头节点,避免头指针丢失 |
| 3 | 19. 删除链表的倒数第 N 个结点 | 中等 | 快慢指针 / 两次遍历 | 快指针先走 n 步,再一起走 → 快到尾,慢刚好在要删的前一个 |
| 4 | 141. 环形链表 | 简单 | 快慢指针 | 快指针走两步,慢指针走一步,相遇即有环 |
| 5 | 142. 环形链表 II | 中等 | 快慢指针 + 数学推导 | 相遇后慢指针回 head,快慢都一步一步走,再相遇即入口 |
练习目标:熟练使用哑节点、快慢指针、虚拟头节点,避免边界情况(空链表、只有一个节点)。
3. 双指针(左右指针 + 快慢指针)
| 序号 | 题目名称 & 链接 | 难度 | 核心考察点 | 提示 / Java 框架思路 |
|---|---|---|---|---|
| 1 | 167. 两数之和 II – 输入有序数组 | 中等 | 有序数组 + 双指针 | 左右指针相向移动,sum > target → 右指针左移 |
| 2 | 15. 三数之和 | 中等 | 排序 + 双指针 + 去重 | 固定一个数 + 左右指针找另外两个(注意去重) |
| 3 | 11. 盛最多水的容器 | 中等 | 左右指针 + 贪心 | 每次移动短板(面积只可能变大或不变) |
| 4 | 42. 接雨水 | 困难 | 双指针 / 单调栈 | 左右指针 + 记录左右最大高度(经典双指针写法) |
| 5 | 75. 颜色分类 | 中等 | 三指针(荷兰国旗) | p0、p1、p2 分别维护 0、1、2 的边界 |
练习目标:掌握“相向双指针”和“快慢指针”的不同使用场景。
4. 滑动窗口(固定 / 可变长度)
| 序号 | 题目名称 & 链接 | 难度 | 核心考察点 | 提示 / Java 框架思路 |
|---|---|---|---|---|
| 1 | 209. 长度最小的子数组 | 中等 | 可变滑动窗口 | 右指针扩张,左指针收缩(当窗口和 >= target 时收缩) |
| 2 | 3. 无重复字符的最长子串 | 中等 | 滑动窗口 + HashSet/Map | 右指针扩张,遇到重复 → 左指针跳到重复字符下一位 |
| 3 | 76. 最小覆盖子串 | 困难 | 滑动窗口 + 计数器 | need / window 两个哈希表 + valid 计数器 |
| 4 | 567. 字符串的排列 | 中等 | 固定长度滑动窗口 | 窗口大小固定为 s1.length(),计数器相等即满足 |
| 5 | 438. 找到字符串中所有字母异位词 | 中等 | 固定长度 + 计数器 | 同 567,但收集所有起点 |
练习目标:熟练写出滑动窗口模板(右指针扩张 → while 收缩左指针 → 更新答案)。
5. 二分查找(及其变种)
| 序号 | 题目名称 & 链接 | 难度 | 核心考察点 | 提示 / Java 框架思路 |
|---|---|---|---|---|
| 1 | 704. 二分查找 | 简单 | 标准二分 | while left <= right,mid = left + (right-left)/2 |
| 2 | 34. 在排序数组中查找元素的第一个和最后一个位置 | 中等 | 二分找边界 | 两次二分:找左边界(>= target)、找右边界(> target) |
| 3 | 33. 搜索旋转排序数组 | 中等 | 有序旋转数组二分 | 判断 mid 在哪一段有序区间 |
| 4 | 153. 寻找旋转排序数组中的最小值 | 中等 | 最小值二分 | while left < right,判断 mid 和 right 关系 |
| 5 | 875. 爱吃香蕉的珂珂 | 中等 | 二分答案 | 最小速度 1,最大速度 max(piles),二分 mid 速度是否可行 |
练习目标:掌握左闭右闭 / 左闭右开模板,熟练处理“找左边界 / 右边界 / 最小满足条件”三种变体。
推荐练习节奏(30 天计划建议)
- 第 1–7 天:数组 + 链表(每天 3–5 题,写暴力 + 优化)
- 第 8–14 天:双指针 + 滑动窗口(重点练窗口收缩条件)
- 第 15–21 天:二分查找 + 二分答案(写左右边界模板)
- 第 22–30 天:混合刷题(Hot 100 中等题 + 剑指 Offer 经典题)
一句话建议:
先把上面 20 题 用 Java 手写 2–3 遍(暴力 → 优化 → 最优),再去 LeetCode Hot 100 / 剑指 Offer 刷专题,就能覆盖 80% 以上 Java 后端面试算法题。
有具体想练的题型(比如只练滑动窗口、只练链表)或想看某道题的 Java 参考框架?直接告诉我,我给你更精细的清单或代码模板。加油!