华为题:LRU 缓存

请你设计并实现一个满足 LRU(最近最少使用)缓存约束的数据结构。

实现 LRUCache 类:

  • LRUCache(int capacity):以正整数 capacity 初始化 LRU 缓存。

  • int get(int key):如果关键字 key 存在于缓存中,则返回其值,否则返回 -1。

  • void put(int key, int value):如果关键字 key 已存在,则变更其值为 value;如果不存在,则插入该键值对。如果插入导致容量超出,则逐出最久未使用的关键字。

输入描述

第一行输入一个整数 capacity。

第二行输入一个整数 m,表示操作次数。

接下来 m 行,每行输入一个操作:

  • get key

  • put key value

输出描述

对于每个 get 操作,输出查询结果。

示例 1

输入

text

复制代码
2
5
put 1 1
put 2 2
get 1
put 3 3
get 2

输出

text

复制代码
1
-1

C++ 解法

cpp

复制代码
#include <bits/stdc++.h>
using namespace std;

class LRUCache {
private:
    int cap;
    list<pair<int,int>> cache;
    unordered_map<int, list<pair<int,int>>::iterator> mp;

public:
    LRUCache(int capacity) : cap(capacity) {}

    int get(int key) {
        if (!mp.count(key)) return -1;

        auto it = mp[key];
        int value = it->second;

        cache.erase(it);
        cache.push_front({key, value});
        mp[key] = cache.begin();

        return value;
    }

    void put(int key, int value) {
        if (mp.count(key)) {
            cache.erase(mp[key]);
        } else if ((int)cache.size() >= cap) {
            int oldKey = cache.back().first;
            cache.pop_back();
            mp.erase(oldKey);
        }

        cache.push_front({key, value});
        mp[key] = cache.begin();
    }
};

int main() {
    int capacity;
    cin >> capacity;

    int m;
    cin >> m;

    LRUCache lru(capacity);

    while (m--) {
        string op;
        cin >> op;

        if (op == "get") {
            int key;
            cin >> key;
            cout << lru.get(key) << endl;
        } else if (op == "put") {
            int key, value;
            cin >> key >> value;
            lru.put(key, value);
        }
    }

    return 0;
}
相关推荐
天府云创2 小时前
Agentic开发时代到来——鸿蒙PC三大原生开发工具公测
华为·操作系统·harmonyos·鸿蒙系统·cli·deveco·agentic
泡海椒2 小时前
JQuickExcel 大文件排障与调优:从实际路径定位 OOM、临时盘和慢任务
开发语言·数据库·缓存·oracle·excel
程序猿追2 小时前
Fleks 鸿蒙适配:从八个小球看实体和组件的变化
华为·harmonyos
m0_738185823 小时前
Flutter 鸿蒙化实战:the_apple_sign_in 适配 OpenHarmony,Apple 登录
flutter·华为·harmonyos·鸿蒙
我命由我123453 小时前
LRU 缓存淘汰策略
数据结构·redis·学习·mysql·算法·缓存·学习方法
m0_738185823 小时前
Flutter 鸿蒙化实战:umeng_analytics_plugin 适配 OpenHarmony,友盟统计
flutter·华为·harmonyos·鸿蒙
十年Java程序媛3 小时前
Redis 分布式锁 + GZIP 压缩缓存踩坑|高并发缓存真实线上复盘
java·开发语言·spring boot·redis·分布式·缓存·面试
todoitbo3 小时前
把 XAMPP 搬到鸿蒙 PC:在鸿蒙 PC 上跑 Apache httpd 2.4.69实战项目
华为·apache·harmonyos·鸿蒙·开源鸿蒙·鸿蒙pc
JoyCong19983 小时前
即插即用,组合键可用:ToDesk 4820版本强化鸿蒙远控键鼠能力
华为·智能手机·harmonyos·远程工作·ipad