Какой самый эффективный способ получения ввода в Java? - PullRequest
3 голосов
/ 10 февраля 2011

Я решаю этот вопрос .

Это мой код:

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,5 МБ входных данных в секунду во время выполнения.

Модифицированный код

Спасибо всем...Я изменил свой код, и он сработал ... вот оно ....

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

привет

шаэнша

Ответы [ 4 ]

1 голос
/ 10 февраля 2011

Это может быть немного быстрее, в зависимости от решения 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 голос
/ 10 февраля 2011

Как насчет этого?

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 голос
/ 10 февраля 2011

Вы можете прочитать большие куски ввода и затем получить цифры оттуда.

Другое изменение заключается в том, что вы можете использовать Integer.parseInt() вместо Scanner.nextInt(), хотя я не знаю подробностей каждого из них, кое-что говорит мне, что версия сканера выполняет немного больше вычислений, чтобы узнать, верен ли ввод,Другой альтернативой является преобразование числа самостоятельно (хотя Integer.parseInt должен быть достаточно быстрым)

Создайте пример ввода и измерьте свой код, измените немного здесь и там и посмотрите, в чем разница.

Мера, мера!

0 голосов
/ 10 февраля 2011

BufferedReader должен быть быстрее, чем Scanner.Вам нужно будет разобрать все самостоятельно, хотя в зависимости от вашей реализации это может быть хуже.

...