算法比赛中处理输入和输出

在算法比赛中,不推荐使用 Scanner 和 System.out.println()Scanner 线程安全,有大量同步操作,读取输入时每次都要解析数据类型,处理大数据量时性能开销大、效率低,易使程序超时间限制。System.out.println() 每次调用都刷新输出缓冲区,缺乏有效缓冲机制,处理大量输出时频繁 I/O 操作会成性能瓶颈,降低输出效率,影响比赛成绩。

为了提高效率,我们可以使用BufferedReaderStreamTokenizer来处理输入,使用PrintWriter来处理输出。

规定数据量

BufferedReader

BufferedReader 是 Java 中用于读取字符流的缓冲输入流,它可以一次读取多个字符到缓冲区中,从而减少了与底层输入源的交互次数,提高了读取效率。

StreamTokenizer

StreamTokenizer 是一个用于解析输入流的实用工具类,它可以将输入流分解为一个个的标记(token),如数字、单词等。结合 BufferedReader 使用,可以更方便地读取不同类型的数据。

PrintWriter

PrintWriter 是一个用于输出字符流的类,它提供了方便的格式化输出方法,并且可以进行缓冲,从而提高输出效率。

假设我们要读取多个整数,计算它们的和,并输出结果。

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.io.StreamTokenizer;

public class LargeDataExample {
    public static void main(String[] args) throws IOException {
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        StreamTokenizer tokenizer = new StreamTokenizer(reader);
        PrintWriter writer = new PrintWriter(System.out);

        // 读取整数的个数
        tokenizer.nextToken();
        int n = (int) tokenizer.nval;

        int sum = 0;
        // 循环读取 n 个整数并求和
        for (int i = 0; i < n; i++) {
            tokenizer.nextToken();
            int num = (int) tokenizer.nval;
            sum += num;
        }

        // 输出结果
        writer.println("这些整数的和是: " + sum);

        // 刷新输出缓冲区
        writer.flush();

        // 关闭资源
        reader.close();
        writer.close();
    }
}

按行读取

在算法比赛中,当需要按行读取输入并进行输出时,BufferedReader 和 PrintWriter 是非常实用的工具。BufferedReader 能够高效地按行读取输入,而 PrintWriter 可以高效地输出结果。以下是详细的使用说明和示例代码。

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;

public class ReadAndWriteByLine {
    public static void main(String[] args) throws IOException {
        // 创建 BufferedReader 对象,用于从标准输入读取数据
        BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        // 创建 PrintWriter 对象,用于将结果输出到标准输出
        PrintWriter writer = new PrintWriter(System.out);

        // 读取第一行输入,这一行通常包含一个整数,表示后续输入的行数
        String firstLine = reader.readLine();
        int numLines = Integer.parseInt(firstLine);

        // 循环读取指定行数的输入
        for (int i = 0; i < numLines; i++) {
            // 读取一行输入
            String line = reader.readLine();
            // 这里可以对读取到的每一行数据进行处理
            // 例如,将每行数据原样输出
            writer.println(line);
        }

        // 刷新 PrintWriter 的缓冲区,确保所有数据都被输出
        writer.flush();
        // 关闭 BufferedReader 和 PrintWriter,释放资源
        reader.close();
        writer.close();
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值