add inerview codes.
This commit is contained in:
parent
550963241c
commit
0ae5f80f36
@ -14,3 +14,6 @@ steps:
|
||||
- cd stl || exit
|
||||
- g++ map.cpp -o map && ./map
|
||||
- cd ..
|
||||
|
||||
- cd interview || exit
|
||||
- g++ memcache.cpp -o memcache && ./memcache
|
109
interview/memcache.cpp
Normal file
109
interview/memcache.cpp
Normal file
@ -0,0 +1,109 @@
|
||||
#include <iostream>
|
||||
#include <vector>
|
||||
#include <map>
|
||||
#define RES_MAX 5
|
||||
using namespace std;
|
||||
|
||||
struct list
|
||||
{
|
||||
list *next = NULL;
|
||||
int k = 0;
|
||||
};
|
||||
|
||||
class Mem
|
||||
{
|
||||
public:
|
||||
int get(int k)
|
||||
{
|
||||
if (memcache.find(k) != memcache.end())
|
||||
{
|
||||
// cache hit: update visit list
|
||||
for (list **node = &visit; *node; node = &((*node)->next))
|
||||
{
|
||||
if ((*node)->k == k)
|
||||
{
|
||||
list *found = *node;
|
||||
*node = (*node)->next;
|
||||
found->next = visit;
|
||||
visit = found;
|
||||
break;
|
||||
}
|
||||
}
|
||||
return memcache.find(k)->second;
|
||||
}
|
||||
else
|
||||
{
|
||||
// cache miss:
|
||||
if (memcache.size() < RES_MAX)
|
||||
{
|
||||
// if cache available: update visit list; update memcache
|
||||
list *node = new list;
|
||||
node->k = k;
|
||||
node->next = visit;
|
||||
visit = node;
|
||||
memcache.emplace(k, 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
// if cache full: swap out oldest memcache; rm oldest visit; update visit
|
||||
for (list **node = &visit; *node; node = &(*node)->next)
|
||||
{
|
||||
if ((*node)->next == NULL)
|
||||
{
|
||||
memcache.erase(memcache.find((*node)->k));
|
||||
delete *node;
|
||||
*node = NULL;
|
||||
memcache.emplace(k, 0);
|
||||
break;
|
||||
}
|
||||
}
|
||||
list *node = new list;
|
||||
node->k = k;
|
||||
node->next = visit;
|
||||
visit = node;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
int set(int k, int v)
|
||||
{
|
||||
if (get(k) != v)
|
||||
{
|
||||
memcache.find(k)->second = v;
|
||||
}
|
||||
return memcache.find(k)->second;
|
||||
}
|
||||
void print()
|
||||
{
|
||||
for (const auto &byte : memcache)
|
||||
{
|
||||
cout << byte.first << ": " << byte.second << endl;
|
||||
}
|
||||
for (list *node = visit; node; node = node->next)
|
||||
{
|
||||
cout << " -> " << node->k;
|
||||
}
|
||||
cout << endl;
|
||||
}
|
||||
|
||||
private:
|
||||
map<int, int> memcache;
|
||||
list *visit = NULL;
|
||||
};
|
||||
|
||||
int main()
|
||||
{
|
||||
Mem mem;
|
||||
for (int i = 10; i > 0; i--)
|
||||
{
|
||||
mem.get(i);
|
||||
}
|
||||
for (int i = 4; i < 7; i++)
|
||||
{
|
||||
if (mem.set(i, i) != i)
|
||||
{
|
||||
cout << "insert " << i << " failed" << endl;
|
||||
}
|
||||
}
|
||||
mem.print();
|
||||
}
|
Loading…
Reference in New Issue
Block a user