add inerview codes.
Some checks reported errors
continuous-integration/drone/push Build is passing
continuous-integration/drone Build was killed

This commit is contained in:
wangjiacai 2022-11-12 16:40:18 +08:00
parent 550963241c
commit 0ae5f80f36
2 changed files with 113 additions and 1 deletions

View File

@ -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
View 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();
}