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

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

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

相关文章:

  • rabbitmq版本升级并部署高可用
  • JDBC、MyBatis 、MyBatis-Plus面试总结(一)
  • 【第14节】C++设计模式(行为模式)-Strategy (策略)模式
  • Spring Boot WebFlux 中 WebSocket 生命周期解析
  • 小程序分类页面
  • 字符串(三)14. 最长公共前缀 简单
  • 计算机网络面试题
  • ‌CentOS 7.9 安装 Docker 步骤
  • 带你从入门到精通——自然语言处理(五. 自注意力机制和transformer的输入部分)
  • C++第二节:C/C++内存管理
  • Mysql convert函数、convert用法、字符串转数字、字符串转日期、类型转换函数
  • 探索C/C++的奥秘之list
  • 第十三届青蓝桥杯青少年Scratch省赛真题——报数游戏
  • smplx 和smpl转换
  • NUMA架构介绍
  • 【Flink银行反欺诈系统设计方案】3.欺诈的7种场景和架构方案、核心表设计
  • 关于软件测试中的bug
  • 使用Dockerfile打包java项目生成镜像部署到Linux_java项目打docker镜像的dockerfile
  • 破局AI算力瓶颈:C++如何铸就大模型时代的性能基石
  • 【轮廓检测详解】
  • 学做网站好做吗/中国突然宣布大消息
  • 做网站 后端是谁来做的/网站推广的渠道有哪些
  • 网新科技做网站怎么样/培训计划模板
  • 保定企业网站建设/黑帽seo培训
  • 聊城wap网站制作/现在搜什么关键词能搜到网站
  • cms网站建设有多少条数据/自己个人怎样做电商