题解 | #牛群的优先级缓存#
牛群的优先级缓存
https://www.nowcoder.com/practice/93e9b8730aef47d68befe07af1e15552
struct DLinkedNode {
int key {0};
int value {0};
DLinkedNode* prev;
DLinkedNode* next;
DLinkedNode () = default;
DLinkedNode (int _key, int _value) : key(_key), value(_value),prev(nullptr), next(nullptr) {
}
};
class LRUCache {
private :
unordered_map<int, DLinkedNode*> cache;
DLinkedNode* head;
DLinkedNode* tail;
int size {0};
int capacity;
public:
LRUCache(int _capacity) : capacity(_capacity) {
head = new DLinkedNode(0,0);
tail = new DLinkedNode(0,0);
head->next = tail;
tail->next = head;
}
void addHead(DLinkedNode* node) {
node->prev = head;
node->next = head->next;
head->next->prev = node;
head->next = node;
}
void removeNode(DLinkedNode* node) {
node->next->prev = node->prev;
node->prev->next = node->next;
}
void moveToHead(DLinkedNode* node) {
removeNode(node);
addHead(node);
}
DLinkedNode* removeTail() {
DLinkedNode* node = tail->prev;
removeNode(node);
return node;
}
int setPriority(int key, int value) {
if (!cache.count(key)) {
auto node = new DLinkedNode(key, value);
cache[key] = node;
addHead(node);
size++;
if (size > capacity) {
DLinkedNode* remove = removeTail();
cache.erase(remove->key);
delete remove;
}
} else {
auto node = cache[key];
node->value = value;
moveToHead(node);
}
return -2;
}
int getPriority(int key) {
if (!cache.count(key) ) {
return -1;
}
DLinkedNode* node = cache[key];
moveToHead(node);
return node->value;
}
};
class Solution {
private:
LRUCache* lrucache;
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param operations string字符串vector
* @param args int整型vector<vector<>>
* @return int整型vector
*/
vector<int> cowCacheOperations(vector<string>& operations,
vector<vector<int> >& args) {
// write code here
vector<int> res;
for (int i = 0; i < operations.size(); i++) {
string operation = operations[i];
if (operation == "CowCache") {
lrucache = new LRUCache(args[i][0]);
res.emplace_back(-2);
} else if (operation == "setPriority") {
lrucache->setPriority(args[i][0], args[i][1]);
res.emplace_back(-2);
} else {
int tmp = lrucache->getPriority(args[i][0]);
res.emplace_back(tmp);
}
}
return res;
}
};


巨人网络公司福利 91人发布

