Я пытаюсь представить решение (используя какой-то онлайн-компилятор с ограничениями времени компиляции) для сортировки array- вот мой код snippet-
class TSORT {
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
PrintWriter bw = new PrintWriter(System.out, false);
int t = Integer.parseInt(br.readLine());
int[] list = new int[1000001];
for(int i = 0; i < t; i++){
int n = Integer.parseInt(br.readLine());
list[n]++;
}
int r=0;
for(int i = 0; i < 1000001; i++){
if(list[i] > 0){
for(int j = 0; j < list[i]; j++){
bw.println(i); // if I use bw.flush() here, time limit gets exceeded.
}
}
}
bw.flush();
}
}
Этот код отправляется успешно, но если я использую flush() как true (автоматический flushing- new PrintWriter(System.out, true);
), компилятор показывает TIME LIMIT EXCEEDED.
Мой вопрос: как я должен использовать flush()
чтобы получить лучшее время компиляции?
Вы отправляете код, и он впоследствии выполняется где-то, поэтому у вас есть исключение TIme Limit Exceeded.
Причина, по которой вы не получаете этого исключения, если отключить автоматическую промывку, проста, как только вы посмотрите на то, что на самом деле означает флеш. flush
блокирует ваш код и ждет, пока все, что было написано в потоке, также не попало в поток к нему (в этом случае System.out
).
Если у вас включена автоматическая промывка, она будет смываться после каждой команды println
. Поэтому после каждого println
ваше приложение блокирует и ожидает, что Java VM или система Host пересылают вашу строку в System.out
.
Если вы отключили автоматическую промывку, строки println
будут сохранены в памяти. В зависимости от реализации потока он все равно может попытаться вымыть данные из памяти в фоновом режиме, но это не обязательно. В конце вашего приложения вы будете писать все свои строки сразу (через flush
). Это происходит быстрее из-за меньших контекстных переключателей и потому, что оно не блокирует ваше приложение от запуска цикла.
PrintStream
?