Java笔试 - ACM模式处理输入输出

本文最后更新于:4 天前

Java笔试: ACM模式处理输入输出

大部分公司都会使用牛客网来进行笔试,当然其中和我们常刷题的leetcode有个重要的不同点就是程序的输入和输出。leetcode模式不需要我们自己去输入测试用例,而是封装一个Solution类由系统调用。而ACM模式则需要我们编写代码手动输入程序的参数和输出程序的结果。

输入

基本的框架可以如下方式构建:

1
2
3
4
5
6
7
8
9
10
import java.util.Scanner;

public class Main{
public static void main(String[] args){
//1. 使用Scanner构建扫描器
Scanner cin = new Scanner(System.in);
//2. 根据题目自定义输入格式

}
}

在上述步骤二中,我们需要根据题目来自定义输入格式,比如:

  1. 读取一个整数

    1
    2
    3
    4
    //int
    cin.nextInt();
    //long
    cin.nextLong();
  2. 读取一个字符或者字符串

    1
    2
    //String
    cin.next();
  3. 读取一个浮点数

    1
    2
    3
    4
    //double
    cin.nextDouble();
    //float
    cin.nextFloat();
  4. 读取一整行(返回String)

    1
    2
    //String
    cin.nextLine();
  5. 循环读取

    有些题目会设置循环读取参数,判断是否还有下一个输入可以用:

    1
    2
    //boolean
    cin.hasNext()

    如果题目中没有说明一次给几个输入,为了保险起见可以直接用while(cin.hasNext()){}将输入包括起来。

    或者就是根据题目设定,先读取数据组数,再设定循环处理数据(如下方例1)

其中next()方法读取到空白符就结束,但是nextLine()读取到回车结束也就是‘\t’。

如果要在next(), nextDouble(), nextFloat(), nextInt()等语句之后使用nextLine()时,需要再加一个nextLine()语句,将被next()去掉的Enter结束符过滤掉。

1
2
3
4
5
6
7
8
9
10
11
public class Main{
public static void main(String[] args){
Scanner cin = new Scanner(System.in);
int num1 = cin.nextInt();
int nums2 = cin.nextInt();
cin.nextLine(); //容易漏掉
String a_b_c = cin.nextLine();
//这样才能读取到正确的内容。
//不加sc.nextLine()的话,a_b_c是一个Enter字符。
}
}

输出

1
2
3
4
5
6
7
8
//一般输出
System.out.print();
//换行输出
System.out.println();
//格式化输出 (有可能在需要四舍五入输出时需要该方法)
System.out.format("%.2f",1.23);
//格式化输出
System.out.printf("这是换行符%n");

例1 重复固定位数的参数

以牛客网[AB28 快速幂][https://www.nowcoder.com/practice/defdedf4fe984c6c91eefa6b00d5f4f0?tpId=308&tqId=2403107&ru=/exam/oj&qru=/ta/algorithm-start/question-ranking&sourceUrl=%2Fexam%2Foj%3Ftab%3D%25E7%25AE%2597%25E6%25B3%2595%25E7%25AF%2587%26topicId%3D308]为例,第一个数输入为调用方法的次数,也就是执行q组参数,但是输入参数个数是固定的3个:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
输入: 2
2 2 6
3 4 10

输出: 4
1

import java.util.Scanner;

public class Main {
public static void main(String[] args) {
//1. 构建Scanner获取输入
Scanner cin = new Scanner(System.in);
//2. 获取执行次数并且设置循环
long q = cin.nextInt();
for(int i = 0;i < q;i++){
//3. 按顺序获取每组的固定参数
long a = cin.nextInt();
long b = cin.nextInt();
long p = cin.nextInt();
//...
}
}
}

例2 读取二维数组

为了读取题目要求的二维数组,我们应该先读取二维数组的长度和宽度存在两个整数中。在下一行将一串整型数字存入二维数组中:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
输入: 3 4
1 2 3 4
5 6 7 8
1 2 3 4

Scanner cin = new Scanner(System.in);
while(cin.hasNext()) {
int r = cin.nextInt();
int c = cin.nextInt();
int[][] matrix = new int[r][c];
cin.nextLine(); // 跳过行数和列数后的换行符
for(int i=0;i<r;i++) {
for (int j = 0; j < c; j++) {
matrix[i][j] = cin.nextInt();
}
}
}