Почему увеличивается объем задействованной памяти

Решил посмотреть какие задачи даются на собеседовании в Яндекс. Наткнулся на такое задание, алгоритмическая часть которого не вызвала вопросов, однако не проходит тест по памяти. Так вот вопрос заключается в следующем: по какой причине задействованная память тут может увеличиваться, если количество переменных константно и не зависит от объема входных данных? И как это можно было бы исправить? P.S. Еще пробовал просто со сканнером, но ошибка та же, только валится на 189 тесте.

введите сюда описание изображения введите сюда описание изображения

import java.io.*;

public class Main {

    public static void main(String[] args) throws IOException {
        BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        int n = readInt(bf);
        if (n == 0) return;
        int prevN = readInt(bf);
        bw.write(prevN + "\n");
        bw.flush();
        for (int i = 1; i < n; i++) {
            int x = readInt(bf);
            if (x != prevN) {
                bw.write(x + "\n");
                bw.flush();
                prevN = x;
            }
        }
        bf.close();
    }
    
    static int readInt(BufferedReader bf) throws IOException {
        int number = 0;
        boolean dig = false;
        boolean minus = false;
        for (int c = 0; (c = bf.read()) != -1; ) {
            if (c == '-') {
                c = bf.read();
                minus = true;
            }
            if (c >= '0' && c <= '9') {
                dig = true;
                number = number * 10 + c - '0';
            } else if (dig) {
                break;
            }
        }
        if (minus) {
            return -number;
        }
        return number;
    }
}

Ответы (2 шт):

Автор решения: NewDumb

Если я правильно понимаю...

У меня была похожая задача, нужно было придумать код который будет принимать числа и сохранять в переменную только максимально заданное число. А после ввода 0 или отрицательного числа выдавать результат максимально введенного числа и завершать программу.

import java.util.Scanner;
import static java.lang.System.*;
public class Executeble {
public static void main(String args[]) {
short ip;
Scanner kb = new Scanner(in);
out.println("введите число.");
ip = kb.nextShort();
short lip = ip;
System.out.println("Num " +ip);
while (ip > 0) {
if (ip < lip) {
    System.out.println("Num " +ip);
    }
if (ip > lip) {
    lip = ip; 
    System.out.println("Num " +ip);
    ip = kb.nextShort();
}  else {
    ip = kb.nextShort() ;
}
}
kb.close();
out.println("Max Value - " +lip+ ".");
}}

вы можете изменить условие на отображение и получать результат только в тех случаях когда число хранящее в переменной меньше введенного числа. А именно... вот код:

    System.out.println("введите число.");
    }
if (ip > lip) {
    lip = ip; 
    System.out.println("Num " +ip);
    ip = kb.nextShort();
}  else {
    ip = kb.nextShort() ;
}
}
kb.close();
}}
→ Ссылка
Автор решения: tym32167

Чет у вас сильно сложно. Нет никакого смысла вообще строки в числа переводить. Там же уже все упорядоченно, вам надо только убрать дубликаты, а дубликаты числа являются также дублткатами в стоковом виде.

Вот пример (сам не проверял)

public static void main(String[] args) throws IOException {
    BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
    BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

    int lines = Integer.parseInt(bf.readLine());
    String currentLine = null;

    for(int i=0; i<lines; i++)
    {
        String next = bf.readLine();
        if (currentLine == null || !currentLine.equals(next))
        {
            currentLine = next;
            bw.write(currentLine);
            bw.write('\n');
        }
    }

    bf.close();
    bw.close();
}
→ Ссылка