java - 竞争性编程和输入

标签 java io


我正在为几周后在我的学院举行的竞技比赛进行练习,因此我遇到了一个小问题。
比赛限制了java.io的使用。*(IOException除外...)
我需要(从标准输入)读取输入,每个测试用例都用空行分隔。测试用例结束 - 当发现 EOF 时。
我需要找到一种从IO获取数据的方法,而不使用java.io
到目前为止,我得到了这个(有效) - 它返回一个包含每个测试用例的字符串,当我没有测试用例时返回 null。

public static String getInput() throws IOException {
    int curr=0;
    int prev=0;
    StringBuilder sb = new StringBuilder();
    while (true) {
        curr = System.in.read();
        if (curr == -1) { 
            return null; //end of data
        }
        if (curr == '\r') {
            curr = System.in.read();
        }
        if (curr == prev && curr == '\n') {
            return sb.toString(); //end of test case
        } //else:
        sb = sb.append((char)curr);
        prev = curr;
    }
}

性能(IO)被忽略,所以我不在乎每次只读取一个字节。
问题:是否有更优雅(编码更短、速度更快)的方法来实现相同的目标?

最佳答案

事实上,有几种方法可以在竞争性编程中处理 Java 中的输入。

方法 1:使用 java.util.Scanner

这是读取输入的最简单方法,而且使用起来也非常简单。如果您有大量输入,速度可能会很慢。如果您的程序不断获得 TLE(超出时间限制),但您的程序具有正确的时间复杂度,请尝试使用第二种或第三种方法读取输入。

初始化Scanner sc = new Scanner(System.in);

读取整数:int n = sc.nextInt(); 方法 2:使用 java.io.BufferedReader

如果输入量很大,并且问题的时间限制很严格,请使用此方法。它确实需要更多的工作,包括按空格分割输入,或使用 Integer.parseInt(str);从输入中提取整数。

您可以在此处找到速度比较 https://www.cpe.ku.ac.th/~jim/java-io.html

初始化:BufferedReader reader = new BufferedReader(System.in);

读取整数:int n = Integer.parseInt(reader.readLine());

方法3:直接从FileDescriptor读取使用自定义阅读器

这种方法是 Java 中最快的方法。它确实需要大量工作,包括实现阅读器,以及在出现任何问题时进行调试。如果时间限制严格并且允许您将代码带入竞赛,请使用此方法。经测试,此方法比第二种方法快得多,但它通常不会为您提供优势,因为它仅是 BufferedReader 速度的大约 2 倍。方法。

这是我的 friend 编写的这种方法的一个实现: https://github.com/jackyliao123/contest-programming/blob/master/Utils/FastScanner.java

阅读器的使用实际上取决于您对阅读器的实现。建议保留一份可以保证正常工作的阅读器副本,因为在竞赛中您最不希望看到的就是拥有一个无法正常工作的阅读器并调试程序的其余部分,并认为其中存在一些错误。

希望这对您有所帮助,并祝您比赛顺利!

关于java - 竞争性编程和输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5423785/

相关文章:

Java Double Format即使为零也显示2个小数点

java - setContentView 可以获取 xml 布局以外的输入吗?

java - NetBean GUI 构建器中的 JSplitPane

java - hashmap 的 containsKey 检查

javascript - 我可以用 HTML5/JS 写文件吗?

java - 如何使用 JPA 和 Hibernate 将 MySQL JSON 列映射到 Java 实体属性

c - C 标准中的 IO

haskell - 我使用 randomRIO 错了吗?

haskell - 在 Haskell 中,有没有办法在函数保护中进行 IO?

java - 为什么Java IO不能实现异步读取?