Java学习记录(一)



前言

最近主播练算法基本都在 LeetCode 上写,函数签名都是平台给好的,写久了确实很容易把 Java 的输入输出忘掉。
但一到笔试、机试或者一些 OJ 平台,突然就切成了 ACM 模式,需要自己处理输入输出,这时候就很容易手忙脚乱。所以这里简单记录一下 Java 常见的输入输出写法,方便后面自己随时翻


一、Java 最常用的输入方式

Java 做算法题时,最常用的是这两种:
Scanner
BufferedReader + String.split() 或 StringTokenizer

二、Scanner 写法

1. 读取单个整数

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        System.out.println(n);
    }
}

2. 读取两个整数

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int a = sc.nextInt();
        int b = sc.nextInt();
        System.out.println(a + b);
    }
}

3. 读取一维数组

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int[] nums = new int[n];

        for (int i = 0; i < n; i++) {
            nums[i] = sc.nextInt();
        }

        for (int i = 0; i < n; i++) {
            System.out.print(nums[i] + " ");
        }
    }
}

4. 读取字符串

这里的 next() 只能读取一个单词,遇到空格就结束。

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String s = sc.next();
        System.out.println(s);
    }
}

5. 读取一整行字符串

nextLine() 会读完整一行

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String line = sc.nextLine();
        System.out.println(line);
    }
}

三、Scanner 的常见坑

1. nextInt() 和 nextLine() 混用问题

这是最容易踩的坑之一。看下面这个例子:

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        String s = sc.nextLine();
        System.out.println("n = " + n);
        System.out.println("s = " + s);
    }
}

输入:

10
hello

你可能以为 s 会读到 hello,但实际上第一次 nextLine() 很可能读到的是上一次输入后残留的换行符。
正确写法一般是先补一行:

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        sc.nextLine(); // 吃掉换行
        String s = sc.nextLine();
        System.out.println(s);
    }
}

除了Scanner还有BufferReader,适合数据量量比较大的输入这里给出模板

import java.io.*;
import java.util.*;

public class Main {
    public static void main(String[] args) throws Exception {
        // BufferedReader:高效输入,适合机试 / OJ
        // InputStreamReader(System.in):把标准输入流包装成字符流
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        
        // 读取第一行输入,并转成整数
        // 假设输入为:5
        int n = Integer.parseInt(br.readLine());
        
        // 定义一个长度为 n 的数组
        int[] nums = new int[n];
        
        // 读取第二行输入
        // 假设输入为:1 2 3 4 5
        // StringTokenizer 会默认按空格切分
        StringTokenizer st = new StringTokenizer(br.readLine());
        
        // 依次读取每个数字并存入数组
        for (int i = 0; i < n; i++) {
            nums[i] = Integer.parseInt(st.nextToken());
        }

        // StringBuilder 用来高效拼接字符串
        StringBuilder sb = new StringBuilder();
        
        // 遍历数组,把每个数字拼接到结果中
        for (int num : nums) {
            sb.append(num).append(" ");
        }
        
        // 输出结果
        System.out.println(sb.toString());
    }
}

四、总结

LeetCode 写久了,忘记 Java 输入输出其实很正常,因为平时根本用不上。
但只要把下面这几个点重新捡起来就够了:
Scanner 适合快速写
BufferedReader 适合机试
StringTokenizer 常配合 BufferedReader
StringBuilder 适合大量输出
注意 nextInt() 和 nextLine() 混用的坑
记录一下,免得下次又忘了。。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐