Какой самый эффективный способ получения ввода в Java?

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

Это мой код:

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

С уважением

shahensha

4 ответа

Решение

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

    }
}

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

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

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

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

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

Мера, мера!

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

Другие вопросы по тегам