【微软高频面试题】IFU缓存

本文介绍了LFU(最不经常使用)缓存的设计与实现,包括LFUCache类的构造、get和put操作。解题思路中提到了使用两个Map,一个用于搜索,一个用于调度。LFU缓存容量满时,会移除最近最久未使用的键。此外,文章提及微软和谷歌面试刷题群的信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

微软和谷歌的几个大佬组织了一个面试刷题群,可以加管理员VX:sxxzs3998(备注优快云),进群参与讨论和直播

1.题目

请你为 最不经常使用(LFU)缓存算法设计并实现数据结构。

实现 LFUCache 类:

LFUCache(int capacity) - 用数据结构的容量 capacity 初始化对象
int get(int key) - 如果键存在于缓存中,则获取键的值,否则返回 -1。
void put(int key, int value) - 如果键已存在,则变更其值;如果键不存在,请插入键值对。当缓存达到其容量时,则应该在插入新项之前,使最不经常使用的项无效。在此问题中,当存在平局(即两个或更多个键具有相同使用频率)时,应该去除 最近最久未使用 的键。

进阶:你可以为这两种操作设计时间复杂度为 O(1) 的实现吗?

输入:
["LFUCache", "put", "put", "get", "put", "get", "get", "put", "get", "get", "get"]
[[2], [1, 1], [2, 2], [1], [3, 3], [2], [3], [4, 4], [1], [3], [4]]

输出:
[null, null, null, 1, null, -1, 3, null, -1, 3, 4]

解释:
// cnt(x) = 键 x 的使用计数

// cache=[] 将显示最后一次使用的顺序(最左边的元素是最近的)

LFUCache lFUCache = new LFUCache(2);

lFUCache.put(1, 1);   // cache=[1,_], cnt(1)=1

lFUCache.put(2, 2);   // cache=[2,1], cnt(2)=1, cnt(1)=1

lFUCache.get(1);      // 返回 1

                      // cache=[1,2], cnt(2)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值