别人刷题是越刷越上头,我刚开始用 Java 刷力扣的时候,是越刷越怀疑人生。语法学了一堆,集合框架也能背出几个,可真到了编辑器里,面对一道标着“简单”的题,经常连第一步该干什么都想不清楚。后来我才意识到,问题不在于刷得少,而在于我用错了方法——一上来就追难题、追题量,笔记倒是存了一堆题解,真正过脑子的没几道。这篇文章就是我整理给自己、也整理给同样在起步阶段的 Java 开发者的“最容易上手版”刷题笔记。它不会一上来就扔动态规划,也不会让你背一堆八股,而是从环境准备、第一道题怎么啃、笔记怎么记,到高频问题怎么排查,一步步把刷题这件事变得可持续。如果你刚学完 Java 基础,或者刷了一阵子力扣但总觉得自己在原地踏步,这篇内容应该能帮你在前 30 道题里少走很多弯路。
1. 刷题前的准备:环境、工程与打底知识点
1.1 JDK 版本怎么选,以及为什么不用纠结
很多人还没开始刷题,先被“装哪个 JDK”卡住了。打开搜索引擎,Java 8、Java 11、Java 17、Java 21 各有各的道理,教程越多越不知道听谁的。
我的建议很简单:如果你没有历史项目拖着,直接装一个 LTS 版本,比如 Java 17。原因有三个:第一,力扣的在线编辑器对 Java 17 的支持已经很成熟,日常刷题用到的语法特性它全都有;第二,Java 17 之后的版本在性能、内存管理上明显更省心,本地跑测试用例不容易遇到奇怪的内存问题;第三,大部分公司的主流项目早就从 Java 8 往上升级了,你刷题用的版本贴近生产环境,后面面试聊起来也不会有“我只会 Java 8”的尴尬。
至于网上常说的 Java 8 和 Java 17 在 switch 表达式、var、文本块这些语法上的差异,刷题阶段你基本用不到。真正需要记住的只有一件事:本地装好后,命令行里执行 java -version 和 javac -version 都能正常输出,说明环境没问题。这个验证步骤很基础,但我见过太多人装了 IDE 就直接写代码,结果 javac 根本不在 PATH 里,编译报错了还以为是代码问题。
提示:环境变量配置里最容易出错的是
JAVA_HOME。配置时不要直接指向 JDK 安装目录的 bin 文件夹,而是指向 JDK 的根目录。比如 Windows 上安装路径是C:\Program Files\Java\jdk-17,JAVA_HOME就填这个路径,然后在 PATH 里加%JAVA_HOME%\bin。配置完一定要重开命令行窗口再验证,否则环境变量不会生效。
1.2 本地建一个最简单的刷题工程
我见过两种极端:一种是从头到尾只在力扣网页上写,提交通过了就关掉页面,代码不留档;另一种是一上来就开 Spring Boot 工程,为了刷一道“两数之和”启动了半天的应用。两种都不太合适。
正确做法是本地建一个没有任何框架依赖的纯 Java 工程。目录结构可以非常朴素:
text复制leetcode-java/
├── src/
│ └── main/
│ └── java/
│ └── solutions/
│ ├── P0001_TwoSum.java
│ ├── P0014_LongestCommonPrefix.java
│ └── ...
└── src/
└── test/
└── java/
└── solutions/
└── P0001_TwoSumTest.java
每个题一个类,类名用 P题号_题名 这种格式,一眼就知道是哪道题。如果用 IDE(IntelliJ IDEA 或者 VS Code 都行),直接建一个普通 Java 项目,不要勾选 Maven 或 Gradle 模板。刷题阶段的依赖基本只有 JDK 自带的类库,引入构建工具纯属给自己增加负担。
在这个工程里,我会在代码文件里保留三样东西:题目描述的关键信息、我的解题思路注释、完整的测试用例。比如下面这类模板就很实用:
java复制package solutions;
public class P0001_TwoSum {
// 题目:给定一个整数数组 nums 和一个整数目标值 target,
// 请你在该数组中找出和为目标值 target 的那两个整数,并返回它们的数组下标。
// 假设每种输入只会对应一个答案,且同一个元素不能使用两遍。
// 思路:用 HashMap 记录“值 -> 下标”,一次遍历。
// 每到一个数,先查 target - nums[i] 是否已经在 map 里。
// 如果在,说明找到了答案,直接返回两个下标。
// 如果不在,把当前值和下标放进去,继续往后走。
public int[] twoSum(int[] nums, int target) {
Map<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < nums.length; i++) {
int need = target - nums[i];
if (map.containsKey(need)) {
return new int[]{map.get(need), i};
}
map.put(nums[i], i);
}
return new int[0];
}
}
本地保留完整的注释和测试代码,不是多此一举。刷题最有价值的部分不是提交通过那一刻的爽感,而是过了两三个星期后回看这道题,还能不能根据注释快速回忆起当时的思考过程。
1.3 真正用得上的 Java API,先混个脸熟
“数据结构没学完,是不是不能开始刷题?”这是新手最爱问的问题。我的回答很直接:不用等学完,先记住最常用的那十几个 API,边刷边补。
最开始你只需要这几样:
- 数组:
int[]、char[],访问用arr[i],长度是arr.length。注意这不是方法,没有括号。 - 字符串:`
