写 Java 算法题时,最容易浪费时间的地方往往不是算法本身,而是项目结构、输入输出、测试代码和运行配置。
如果目标是:
- 在 VS Code 中快速编写和运行;
- 每道题都能保留;
- 支持硬编码测试;
- 支持 ACM 标准输入输出;
- 能直接复制核心代码到 LeetCode;
那么最合适的方式是:
每道题一个文件夹,
Solution.java只写核心算法,Main.java负责编写测试和输入输出。
这套结构不需要 Maven、Gradle,也不需要 JUnit。
一、目录结构
建议使用下面的结构:
|
|
每道题单独放进一个文件夹。
包名不能以数字开头,因此推荐使用:
|
|
而不是:
|
|
二、VS Code 配置
在项目根目录创建:
|
|
内容如下:
|
|
这段配置的作用是:
- 将
src作为源码目录; - 将编译结果输出到
out; - 在 VS Code 集成终端中运行程序;
- 支持标准输入。
之后直接用 VS Code 打开整个 Algorithms 文件夹即可。
三、核心代码:Solution.java
以 LeetCode 1 两数之和为例。
|
|
Solution.java 中只保留:
- 题目要求的方法;
- 必要的成员变量;
- 必要的辅助方法。
不要把测试逻辑写进这个文件。
提交到 LeetCode 时,只需要复制 Solution 类,并删除:
|
|
四、测试代码:Main.java
|
|
运行 Main.java 后,输出类似:
|
|
五、在两种模式之间切换
LeetCode / 面试模式
使用硬编码测试:
|
|
适合:
- LeetCode 刷题;
- 面试现场验证;
- 调试边界条件;
- 快速构造测试用例。
ACM 模式
改为:
|
|
适合:
- 洛谷;
- 牛客;
- Codeforces;
- 需要标准输入输出的笔试平台。
核心算法仍然放在 Solution.java 中,不需要修改。
六、常用测试方法
比较整数
|
|
比较字符串
|
|
比较一维数组
|
|
比较二维数组
|
|
比较 List
|
|
七、注意会修改输入的算法
有些算法会直接修改原数组,例如岛屿问题中的 DFS:
|
|
因此,同一个测试数组不能重复使用:
|
|
第二次运行时,原数组已经被修改。
可以写一个二维数组复制方法:
|
|
使用时:
|
|
八、面试时的单文件版本
正式面试通常不需要拆成两个文件,可以临时写成一个文件:
|
|
推荐顺序:
- 先完成核心方法;
- 写一个普通测试;
- 补充边界测试;
- 运行验证;
- 再分析复杂度。
九、为什么不建议一开始使用 JUnit
JUnit 很适合正式项目,但对刷题来说通常过重。
它会额外引入:
- Maven 或 Gradle;
- 测试目录;
- 测试依赖;
- 注解;
- 更多项目配置。
刷算法题时,手写 check 方法已经足够:
|
|
这种方式没有依赖,复制方便,也更接近面试环境。
十、推荐工作流
每写一道新题:
|
|
平时刷题:
|
|
ACM 模式:
|
|
这套工作流的核心是:
核心算法和测试代码分离,但不引入复杂工程配置。
它既适合日常刷题,也适合面试和笔试环境。