哪种是在Java中获取输入的最有效方法?

时间:2011-02-10 17:49:04

标签: java optimization io user-input inputstream

我正在解决这个question

这是我的代码:

import java.io.IOException;
import java.util.Scanner;


public class Main {
    public static void main(String[] args) throws IOException {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int k = sc.nextInt();
        int[] t = new int[n];
        int count = 0;
        for (int i = 0; i < n; i++) {
            t[i] = sc.nextInt();
            if (t[i] % k == 0) {
                count++;
            }
        }
        System.out.println(count);

    }
}

但是当我提交它时,它会超时。请尽可能地帮助我优化它。

实施例

输入:

7 3
1
51
966369
7
9
999996
11

输出:

4

他们说:

  

您应该能够处理   每个至少2.5MB的输入数据   第二个在运行时。

修改后的代码

谢谢大家......我修改了我的代码,但它确实有用......这里是......

 public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String[] input = br.readLine().split(" ");
        int n = Integer.parseInt(input[0]);
        int k = Integer.parseInt(input[1]);
        int count = 0;
        for (int i = 0; i < n; i++) {
            if (Integer.parseInt(br.readLine()) % k == 0) {
                count++;
            }
        }
        System.out.println(count);
    }

问候

shahensha

4 个答案:

答案 0 :(得分:1)

这个怎么样?

Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int k = sc.nextInt();
int count = 0;
for (int i = 0; i < n; i++) {
    if (sc.nextInt() % k == 0) {
        count++;
    }
}
System.out.println(count);

答案 1 :(得分:1)

您可以考虑阅读大块输入,然后从那里获取数字。

其他变化是,您可以使用Integer.parseInt()而不是Scanner.nextInt(),虽然我不知道每个的详细信息,但有些事情告诉我Scanner版本执行更多计算以了解输入是否是正确。另一种方法是自己转换数字(尽管Integer.parseInt应该足够快)

创建一个示例输入,并测量您的代码,在这里和那里稍微改变一下,看看有什么区别。

衡量,衡量!

答案 2 :(得分:1)

根据limc的解决方案,这可能会稍快一些,但BufferedReader应该更快。

import java.io.IOException;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) throws IOException {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int k = sc.nextInt();
        int count = 0;
        while (true) {
            try {
                if (sc.nextInt() % k == 0) {
                    count++;
                }
            } catch (NoSuchElementException e) {
                break;
            }
        }
        System.out.println(count);

    }
}

答案 3 :(得分:0)

BufferedReader应该比Scanner更快。您需要自己解析所有内容,并且根据您的实现情况,可能会更糟。