Как снизить потребление оперативной памяти?
Пытаюсь решить тестовое задание, но не прохожу по памяти.
Само задание:
- Ограничение времени, с 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}`;
}
}
При отправке на проверку не проходим по памяти. Тестовые которые я придумал вроде решает.