Пошук уроків, статей та іншого контенту
Реалізуйте кеш із витісненням найдавніше використаного елемента (LRU) фіксованої ємності.
Напишіть функцію solve(capacity, operations), яка симулює LRU-кеш ємністю capacity. operations — масив операцій виду ["put", key, value] або ["get", key]. Поверніть масив результатів у тому самому порядку: для "put" результат завжди null; для "get" — значення за ключем, якщо воно є в кеші, або -1, якщо немає. Кожне звернення до ключа (і put, і успішний get) робить його «нещодавно використаним»; коли ємність кешу перевищена, витісняється найдавніше використаний ключ.
Приклади
Вхід: solve(2, [["put",1,1],["put",2,2],["get",1],["put",3,3],["get",2]])
Вихід: [null, null, 1, null, -1]
put(3,3) витісняє ключ 2, бо після get(1) саме ключ 2 лишився найдавніше використаним
Обмеження: 1 ≤ capacity ≤ 1000
Ваше рішення
Підказки
Map у JavaScript зберігає порядок вставки ключів і дозволяє за O(1) перевірити наявність, прочитати та видалити елемент — це природна структура для LRU-кешу.
Щоб позначити ключ як «щойно використаний», видаліть його з Map і одразу вставте знову (set) — він автоматично опиниться в кінці порядку вставки.
Коли розмір Map перевищує capacity, найдавніше використаний ключ — це перший ключ в ітераторі Map (cache.keys().next().value).
function solve(capacity, operations) {
const cache = new Map();
const results = [];
for (const [op, key, value] of operations) {
if (op === "put") {
if (cache.has(key)) cache.delete(key);
cache.set(key, value);
if (cache.size > capacity) {
const oldestKey = cache.keys().next().value;
cache.delete(oldestKey);
}
results.push(null);
} else {
if (!cache.has(key)) {
results.push(-1);
} else {
const val = cache.get(key);
cache.delete(key);
cache.set(key, val);
results.push(val);
}
}
}
return results;
}Delete-then-set — стандартний прийом для позначення ключа «щойно використаним» у Map: сам Map не має методу «перемістити в кінець», але видалення і повторна вставка того самого ключа дають той самий ефект, бо Map ітерується в порядку вставки.