本站的教程文章中大部分以力扣题目作为例题,力扣题目采用的是「核心代码」模式,但是在面试和笔试中,很多公司会采用「ACM 模式」。
所以本文具体介绍一下 ACM 模式和核心代码模式的区别,并提供一套通用的 ACM 模式代码模板,帮你把 ACM 模式转化成熟悉的核心代码模式代码。
另外,本站 配套题库 中的所有题目同时支持核心代码模式和 ACM 模式,大家也可以在题库中练习,理解两种模式的区别和联系。
ACM 模式 vs 核心代码模式
ACM 模式和力扣刷题主要有三个区别:左下方题目示例、右下方自测用例区域、右上方代码区域。
如下图所示,是 leetcode 模式(核心代码模式):

注意以下几点:
- 左下方题目示例直接描述函数入参。
- 右下方自测用例的输入就是入参的值,和题目示例类似。
- 右上方代码区域仅需编写算法函数,把结果通过返回值返回。
如下图所示,是 ACM 模式:

注意以下几点:
- 左下方题目示例就是若干行字符串,告诉你这些字符串的格式以及结构。
- 右下方自测用例的输入也是多行字符串,和题目示例类似。
- 右上方代码区域需要自己导包,自己读取解析字符串,然后才是写算法求解,最后还要把结果打印出来。
接下来看 ACM 模式的代码,最关键的是:一定要读取到输入的 EOF 才能停,因为你不知道题目输入多少组测试用例。
如上图,其实你把数据读取的逻辑和算法逻辑解耦,就可以完全转化成 leetcode 模式了。理论上,你不用这样解耦,可以一遍读取数据一边计算结果,但是那样代码会比较混乱,不利于调试和理解。
所以我建议按照上图那样,把数据读取的逻辑和算法逻辑解耦,既方便调试和理解,又和 leetcode 的核心代码模式相似。
ACM 模式代码模板
Java/C++/C/Python/JS/Go 的 ACM 代码模板如下,重点记忆如何读输入读到 EOF 就行:
import java.util.*;
class Solution {
public int add(int a, int b) {
return a + b;
}
}
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
// 读取到 EOF
while (sc.hasNext()) {
int a = sc.nextInt();
int b = sc.nextInt();
int result = new Solution().add(a, b);
System.out.println(result);
}
sc.close();
}
}ACM 本身没啥难的,花半个小时就能学会了,算法本身才是重点啊!
所以我的建议是,大家平时完全可以用核心代码模式来刷题、学习算法。面试笔试前夕,在本站配套题库中练习一下 ACM 模式就可以了,下面就是两道练习题:
给你输入两个整数 a 和 b,请你计算它们的和。
数据规模:
-1000 <= a, b <= 1000
输入格式
输入包含多行数据,每行包含两个用空格分隔的整数。
你的每行输出对应着每行输入的求和结果。
示例输入
1 2
-3 -4示例输出
3
-7请你计算一个长度为 n 的一维数组 nums 中所有元素之和。
数据范围:
1 <= n <= 10^51 <= nums[i] <= 10^9
输入格式
第一行包含一个整数 (),表示询问的组数。
接下来依次描述这 组数据。每组数据的第一行包含一个整数 ,表示数组长度。第二行包含 个正整数,为数组元素。
输出格式
输出共 行,每行一个整数,表示对应数组元素之和。
示例输入
3
3
1 4 7
1
1000
2
1 2示例输出
12
1000
3解释:第一组数组为 [1, 4, 7],元素和为 12;第二组数组为 [1000],元素和为 1000;第三组数组为 [1, 2],元素和为 3。