From 0ae5f80f363b007226a7d4f80d51ac945c901a6a Mon Sep 17 00:00:00 2001 From: wangjiacai Date: Sat, 12 Nov 2022 16:40:18 +0800 Subject: [PATCH] add inerview codes. --- .drone.yml | 5 +- interview/memcache.cpp | 109 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 113 insertions(+), 1 deletion(-) create mode 100644 interview/memcache.cpp diff --git a/.drone.yml b/.drone.yml index eeaaef2..60d44e2 100644 --- a/.drone.yml +++ b/.drone.yml @@ -13,4 +13,7 @@ steps: - cd stl || exit - g++ map.cpp -o map && ./map - - cd .. \ No newline at end of file + - cd .. + + - cd interview || exit + - g++ memcache.cpp -o memcache && ./memcache \ No newline at end of file diff --git a/interview/memcache.cpp b/interview/memcache.cpp new file mode 100644 index 0000000..a205023 --- /dev/null +++ b/interview/memcache.cpp @@ -0,0 +1,109 @@ +#include +#include +#include +#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 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(); +} \ No newline at end of file