什么是Java中最高效的输入方式?

3

我正在解决这个问题

这是我的代码:

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

(沙亨莎)

1
如果你在这里没有使用这个数组进行任何有用的事情,那么为什么要使用int[] t呢?你可以使用int t代替。 - limc
这看起来像是ACM-ICPC问题的输入代码,这就是整个“程序”吗?它超时了吗?是在线评测系统吗?你能给我们一些样例输入吗? - Argote
是的,这就是整个程序...他们在他们的服务器上运行代码...他们为这个特定的程序给了我们8秒钟...他们说:“你应该能够在运行时每秒处理至少2.5MB的输入数据。” - shahensha
输入格式是否是这样的?或者在每个整数之间有未知数量的空格?还是每个数字都在不同的行上? - Argote
最有效的方式是什么? - kta
显示剩余3条评论
4个回答

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);

这真的会改变输入速度吗? - Piotr Findeisen
1
这种方法的优点在于(从速度上来说)它不需要实例化数组(而且使用的内存更少),输入速度应该是相同的。 - Argote
1
这要取决于他的 n。如果 n 的值很大,那么你会在内存中创建一个巨大的 int 数组,而这没有任何意义。 - limc

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);

    }
}

1

你可以考虑一次读取大块的输入,然后从中获取数字。

另一个改变是,你可以使用 Integer.parseInt() 而不是 Scanner.nextInt(),尽管我不知道每个方法的细节,但有些东西告诉我 Scanner 版本会执行更多计算以确定输入是否正确。另一种选择是自己转换数字(尽管 Integer.parseInt 应该足够快)。

创建一个样例输入,测量你的代码,稍微改变一下,看看差异在哪里。

测量,测量!


0
"BufferedReader应该比Scanner更快。但是你需要自己解析所有内容,根据你的实现方式可能会更糟糕。"

非常感谢Argote!我用BufferedReader实现了它,没有使用数组,而且它可以工作。我应该为其他人发布更正后的代码吗? - shahensha

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接