Какой самый эффективный способ получения ввода в 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
, Вам нужно будет разобрать все самостоятельно, хотя и в зависимости от вашей реализации это может быть хуже.