add inerview codes.
This commit is contained in:
parent
550963241c
commit
0ae5f80f36
@ -13,4 +13,7 @@ steps:
|
|||||||
|
|
||||||
- cd stl || exit
|
- cd stl || exit
|
||||||
- g++ map.cpp -o map && ./map
|
- g++ map.cpp -o map && ./map
|
||||||
- cd ..
|
- 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