当前位置: 首页 > article >正文

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

在算法比赛中,不推荐使用 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();
    }
}


http://www.kler.cn/a/573156.html

相关文章:

  • docker:配置 Docker 镜像加速器
  • Mybatis中的设计模式
  • linux如何在某个文件夹下查看所有文件(层级只到当前文件夹的两层)并找到‘XXXX’ 这个单词
  • 基于 Next.js(前端)和 FastAPI(后端)使用 WebSocket(满血版DeepSeek-R1回答)
  • 大模型核心要素完全解析:从数字神经元到智能对话的奥秘
  • npm install 报错 ---- 忽略版本冲突
  • 消息系统队列(Message Queue)之kafka
  • TCP-UDP-WebSocket-组播-单播
  • unity文字转语音usherpa-onnx-tts
  • python-leetcode-零钱兑换 II
  • 【数据结构】什么是栈||栈的经典应用||分治递归||斐波那契问题和归并算法||递归实现||顺序栈和链栈的区分
  • MySQL零基础教程15—简单的表连接(join)
  • 外盘农产品期货数据:历史高频分钟回测的分享下载20250305
  • Linux--基本指令4(完结)和权限
  • 基于Windows11的DockerDesktop安装和布署方法简介
  • C# Unity 面向对象补全计划 之 索引器与迭代器
  • Go语言select的高级玩法
  • Vue的简单入门 三
  • OCPP扩展机制与自定义功能开发:协议灵活性设计与实践 - 慧知开源充电桩平台
  • 确定信号分析:从傅里叶级数到信号带宽的Matlab实践