Как снизить потребление оперативной памяти?

Пытаюсь решить тестовое задание, но не прохожу по памяти.

Само задание:

  • Ограничение времени, с 2
  • Ограничение памяти, МБ 96
  • Общее число попыток отправки 15

Петя решил узнать, когда программисту выгоднее всего искать работу на hh.ru. Конечно, когда больше всего открыто вакансий.

Он выгрузил в текстовый файл время открытия и закрытия всех подходящих вакансий за 2019 год.

Теперь нужно определить период времени, когда открытых вакансий было больше всего.

Считаем, что:

  • начальное и конечное время всегда присутствуют;
  • начальное время всегда меньше или равно конечному;
  • начальное и конечное время включены в интервал.

Входные данные

Входная информация поступает из стандартного ввода, в первой строке приходит 1 число - количество вакансий. Каждая из следующих строк содержит информацию о вакансии в виде двух чисел – начальное и конечное время, они разделены пробелом. Время задается в секундах (https://ru.wikipedia.org/wiki/Unix-время). Некорректные данные на вход не поступают, дополнительные проверки не требуются.

Выходные данные

В качестве ответа в стандартный вывод через пробел нужно вывести два числа: количество найденных интервалов и сумму длительности интервалов в секундах (начальная и конечная секунды должны быть включены в интервал).

Пример 1

Входные данные:

  • 1
  • 1595862781 1595862785

Выходные данные: 1 5

Пример 2

Входные данные:

  • 2
  • 1595862781 1595862783
  • 1595862782 1595862784

Выходные данные: 1 2

Пример 3

Входные данные:

  • 2
  • 1595862781 1595862782
  • 1595862783 1595862784

Выходные данные: 2 4

Примечания по оформлению решения

При отправке решений на Java необходимо назвать исполняемый класс Main. В решении не нужно указывать пакет.

Для работы со стандартным потоком ввода в JS используйте require('readline'), а для работы со стандартным потоком вывода - console.log(String(data)).

Пример ввода-вывода на JS:

const readline = require('readline');
const rl = readline.createInterface(process.stdin, process.stdout);
rl.on('line', (line) => {
    // Введенная строка в переменной line, тут можно написать решение
    console.log(String(result));
    rl.close();
    return;
}).on('close', () => process.exit(0));

Моё решение:

function calculateIntervalNumberAndSumOfDuration(strArr) {
  let vacanciesNum = +strArr.shift();
  let vacanciesTime = strArr;

  if (vacanciesNum === 0) {
    return "0 0";
  } else {
    let allIntervals = [];
    for (const el of vacanciesTime) {
      for (
        let i = +el.split(" ")[0];
        i <= +el.split(" ")[1];
        i++
      ) {
        for (let j = i; j < +el.split(" ")[1] + 1; j++) {
          allIntervals.push(`${i} ${j}`);
        }
      }
    } //Находим все возможные интервалы
    allIntervals.sort();

    let repeatingIntervals = [];
    let countRepeating = 1;
    for (let i = 0; i < allIntervals.length; i++) {
      if (allIntervals[i] === allIntervals[i + 1]) {
        countRepeating++;
        continue;
      }
      repeatingIntervals.push(
        `${countRepeating}: ${allIntervals[i]}`
      );
      countRepeating = 1;
    } //Проверяем сколько повторяется каждый интервал
    repeatingIntervals.sort();

    let maxIntervalsNum = +repeatingIntervals[
      repeatingIntervals.length - 1
    ].split(": ")[0]; //Узнаём максимальное число повторений интервалов

    let maxIntervals = repeatingIntervals.filter((val) => {
      if (+val.split(": ")[0] !== maxIntervalsNum) {
        return false;
      }
      return true;
    }); // Оставляем только максимальные интервалы

    let filteredMaxIntervals = maxIntervals.filter(
      (val1, i) => {
        for (const val2 of maxIntervals) {
          let startTime1 = +val1
              .split(": ")[1]
              .split(" ")[0],
            endTime1 = +val1.split(": ")[1].split(" ")[1],
            startTime2 = +val2.split(": ")[1].split(" ")[0],
            endTime2 = +val2.split(": ")[1].split(" ")[1];
          if (
            (startTime2 <= startTime1 &&
              endTime2 > endTime1) ||
            (startTime2 < startTime1 &&
              endTime2 >= endTime1)
          ) {
            return false;
          }
        }
        return true;
      }
    ); // Убираем все входящие интервалы

    let filteredIntervalsNum = filteredMaxIntervals.length; // количество максимальных интервалов
    let filteredIntervalsDurationSum = filteredMaxIntervals.reduce(
      (prev, cur) => {
        prev +=
          +cur.split(": ")[1].split(" ")[1] -
          +cur.split(": ")[1].split(" ")[0] +
          1;
        return prev;
      },
      0
    ); // длина максимальных интервалов

    return `${filteredIntervalsNum} ${filteredIntervalsDurationSum}`;
  }
}

При отправке на проверку не проходим по памяти. Тестовые которые я придумал вроде решает.


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