C语言纯暴力解法,能AC我没想到
typedef struct {
int key;
int val;
int time;
} LRUCache;
int g_cap; // 全局变量记录缓存容量
int g_time; // 利用全局变量更新put和get操作时关键值的time
int g_cnt; // 全局变量记录当前缓存利用了多少
LRUCache* lRUCacheCreate(int capacity) {
g_cap = capacity;
g_time = 0;
g_cnt = 0;
LRUCache *obj = (LRUCache*)malloc(sizeof(LRUCache) * capacity);
return obj;
}
int lRUCacheGet(LRUCache* obj, int key) {
for (int i = 0; i < g_cnt; i++) {
if (obj[i].key == key) { // 在缓存中存在key
obj[i].time = ++g_time; // 重要,更新time
return obj[i].val;
}
}
return -1; // 缓存中不存在key
}
void lRUCachePut(LRUCache* obj, int key, int value) {
LRUCache *last = NULL; // 最久没有操作的key
int t = INT_MAX; // t用来记录最久没有操作的key的时间点,显然越小越久
++g_time; // 不管缓存满不满都要put当前的key,所以time肯定得更新
for (int i = 0; i < g_cnt; i++) {
if (t > obj[i].time) { // 更新最久没有操作过的key
t = obj[i].time;
last = obj + i;
}
if (obj[i].key == key) { // 缓存中存在key,更新value和time即可
obj[i].val = value;
obj[i].time = g_time;
return;
}
}
if (g_cnt == g_cap) { // 缓存满了,且没有key,则将最久没操作的key覆盖
last->key = key;
last->val = value;
last->time = g_time;
return;
}
obj[g_cnt].key = key; // 缓存没满,且没有key,直接加入即可
obj[g_cnt].val = value;
obj[g_cnt++].time = g_time;
}
void lRUCacheFree(LRUCache* obj) {
free(obj);
}