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