Amazon Interview Question
SDE-2sCountry: India
C++ Code (Queue with DLL and Hash Map)
struct LRUCacheNode {
int key;
int value;
LRUCacheNode* prev;
LRUCacheNode* next;
LRUCacheNode(): key(0),value(0),next(NULL),prev(NULL) { } ;
} ;
class LRUCache{
private:
hash_map< int, LRUCacheNode* > Map;
LRUCacheNode * Head;
LRUCacheNode * Tail;
int Capacity ;
int Count ;
public:
LRUCache(int capacity) {
Capacity = capacity ;
Count = 0 ;
Head = new LRUCacheNode;
Tail = new LRUCacheNode;
Head->prev = NULL;
Head->next = Tail;
Tail->next = NULL;
Tail->prev = Head;
}
~LRUCache ( ) {
delete Head;
delete Tail;
}
int get(int key) {
LRUCacheNode* node = Map[key];
if(node)
{
DetachNode(node);
AttachNodeToFront(node);
return node->value;
}
else
return -1 ;
}
void set(int key, int value) {
LRUCacheNode* node = Map[key];
if(node)
{
DetachNode(node);
node->value = value;
AttachNodeToFront(node);
}
else{
LRUCacheNode* node = new LRUCacheNode ;
if ( Capacity == Count ) { // If Cache is Full
RemoveLRUNode ( key ) ;
}
node->key = key;
node->value = value;
Map[key] = node;
AttachNodeToFront(node);
Count++ ;
}
}
private:
void RemoveLRUNode ( int key ) {
LRUCacheNode* node = Tail->prev;
DetachNode(node);
Map.erase(node->key);
Count-- ;
}
void DetachNode(LRUCacheNode* node) {
node->prev->next = node->next;
node->next->prev = node->prev;
}
void AttachNodeToFront(LRUCacheNode* node) {
node->next = Head->next;
node->prev = Head;
Head->next = node;
node->next->prev = node;
}
};
In Java, we can do it using LinkedHashMap
- Anonymous August 04, 2013