本站的教程文章中大部分以力扣题目作为例题,力扣题目采用的是「核心代码」模式,但是在面试和笔试中,很多公司会采用「ACM 模式」。

所以本文具体介绍一下 ACM 模式和核心代码模式的区别,并提供一套通用的 ACM 模式代码模板,帮你把 ACM 模式转化成熟悉的核心代码模式代码。

另外,本站 配套题库 中的所有题目同时支持核心代码模式和 ACM 模式,大家也可以在题库中练习,理解两种模式的区别和联系。

ACM 模式 vs 核心代码模式

ACM 模式和力扣刷题主要有三个区别:左下方题目示例、右下方自测用例区域、右上方代码区域。

如下图所示,是 leetcode 模式(核心代码模式):

注意以下几点:

  1. 左下方题目示例直接描述函数入参。
  2. 右下方自测用例的输入就是入参的值,和题目示例类似。
  3. 右上方代码区域仅需编写算法函数,把结果通过返回值返回。

如下图所示,是 ACM 模式:

注意以下几点:

  1. 左下方题目示例就是若干行字符串,告诉你这些字符串的格式以及结构。
  2. 右下方自测用例的输入也是多行字符串,和题目示例类似。
  3. 右上方代码区域需要自己导包,自己读取解析字符串,然后才是写算法求解,最后还要把结果打印出来。

接下来看 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 模式就可以了,下面就是两道练习题:

题目描述解法提交
做题
ACM 模式:输入输出模板

给你输入两个整数 ab,请你计算它们的和。

数据规模:

  • -1000 <= a, b <= 1000

输入格式

输入包含多行数据,每行包含两个用空格分隔的整数。

你的每行输出对应着每行输入的求和结果。

示例输入

1 2
-3 -4

示例输出

3
-7
题目描述解法提交
做题
ACM 模式:T 组询问模板

请你计算一个长度为 n 的一维数组 nums 中所有元素之和。

数据范围:

  • 1 <= n <= 10^5
  • 1 <= nums[i] <= 10^9

输入格式

第一行包含一个整数 TT1T1001 \le T \le 100),表示询问的组数。

接下来依次描述这 TT 组数据。每组数据的第一行包含一个整数 nn,表示数组长度。第二行包含 nn 个正整数,为数组元素。

输出格式

输出共 TT 行,每行一个整数,表示对应数组元素之和。

示例输入

3
3
1 4 7
1
1000
2
1 2

示例输出

12
1000
3

解释:第一组数组为 [1, 4, 7],元素和为 12;第二组数组为 [1000],元素和为 1000;第三组数组为 [1, 2],元素和为 3。