Какой самый эффективный способ ввода данных в 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);
    }

С уважением

шагенша


person shahensha    schedule 10.02.2011    source источник
comment
Зачем использовать int[] t, если вы не используете этот массив для каких-либо полезных вещей здесь? Вместо этого вы могли бы использовать int t.   -  person limc    schedule 10.02.2011
comment
Это похоже на входной код для задачи ACM-ICPC, это вся программа? Откуда таймаут? он-лайн судья? Можете ли вы дать нам пример ввода?   -  person Argote    schedule 10.02.2011
comment
да, это вся программа... и они запускают код на своих серверах.... они дали нам 8 секунд на эту конкретную программу.... они говорят, что вы должны обработать не менее 2,5 МБ ввода данных в секунду во время выполнения.   -  person shahensha    schedule 10.02.2011
comment
вход отформатирован так? или у вас есть неизвестное количество пробелов между каждым int? или каждое число в отдельной строке?   -  person Argote    schedule 10.02.2011
comment
В первой строке есть пробел между n и k... и далее каждое число находится на новой строке....   -  person shahensha    schedule 10.02.2011
comment
@Argote - я отформатировал разделы ввода и вывода, чтобы сделать их более понятными.   -  person Andrzej Doyle    schedule 10.02.2011
comment
В этом случае вы можете использовать BufferedReader, как я уже упоминал в ответе, получить первую строку, использовать String.split в строке и проанализировать каждый элемент, затем прочитать каждую строку и поместить ее в Integer.parseInt и использовать это в операции по модулю.   -  person Argote    schedule 10.02.2011
comment
самый эффективный способ?   -  person kta    schedule 16.02.2015


Ответы (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);

    }
}
person Argote    schedule 10.02.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);
person limc    schedule 10.02.2011
comment
это действительно меняет скорость ввода? - person Piotr Findeisen; 10.02.2011
comment
Преимущество этого (с точки зрения скорости) заключается в том, что он не создает экземпляр массива (плюс он использует меньше памяти), скорость ввода должна быть одинаковой. - person Argote; 10.02.2011
comment
Это зависит от его n. Если значение для n огромно, то вы зря создаете в памяти огромный массив int. - person limc; 10.02.2011

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

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

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

Измерь, измерь!

person OscarRyz    schedule 10.02.2011

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

person Argote    schedule 10.02.2011
comment
Большое спасибо Арготе! Я реализовал это с помощью BufferedReader и без массива, и это сработало.... Должен ли я опубликовать исправленный код для других....??? - person shahensha; 10.02.2011