#include <iostream>
#include <vector>
#include <string>
#include <map>
using namespace std;
/*************************************************************
* 函数名 :creatVector
* 作用 :将一个数组的字符串形式转换成vector<int>形式
* 输入示例 :"[1,1,1]"
* 输出示例 :vector<int>{1,1,1}
* 驱动模块 :vector<int> data = creatVector("[1,1,1]");
*************************************************************/
vector<int> creatVector(string str)
{
vector<int> data;
int flag = 0;
bool nullFlag = 0;
for (char i : str)
{
if (i == ']' || i == ',')
{
if (nullFlag == 1)
{
data.push_back(flag);
}
flag = 0;
nullFlag = 0;
}
else if (i != '[')
{
nullFlag = 1;
flag = flag * 10 + (int(i) - 48);
}
}
return data;
}
/*************************************************************
* 函数名 :createDoubleVector
* 作用 :将一串二维数组(不定长)的字符串形式转换成vector<vector<int>>形式
* 输入示例 :"[[1,1,1],[1,1,1],[1,1,1]]"
* 输出示例 :vector<vector<int>> {{1,2,3},{4,5,6},{7,8,9}}
* 驱动模块 :string test = "[[1,1,1],[1,2,2],[2,1],[1,3,3],[2,2],[1,4,4],[2,1],[2,3],[2,4]]";
* vector<vector<int>>data = createDoubleVector(test);
*************************************************************/
vector<vector<int>> createDoubleVector(string s)
{
vector<vector<int>> data;
if (s.length() == 0)
{
return data;
}
string str = "";
for (int i = 1; i < s.length() - 1; i++)
{
if (s[i] == ']')
{
str = str + s[i];
vector<int> temp = creatVector(str);
data.push_back(temp);
str = "";
}
else
{
str = str + s[i];
}
}
return data;
}
/*************************************************************
* 核心题目代码
*************************************************************/
class Solution
{
private:
typedef struct NODE
{
int data[2];
struct NODE *Left, *Right;
} N;
typedef N *node;
node head = new NODE;
node tail = new NODE;
int size = 0;
public:
Solution()
{
head->Right = tail;
tail->Left = head;
head->data[1] = -1;
}
void delF()
{
if (size > 0)
{
node temp = head->Right;
head->Right = temp->Right;
head->Right->Left = head;
delete temp;
}
}
void insert(node p){
node previous = tail->Left;
p->Left = previous;
p->Right = tail;
previous->Right = p;
tail->Left = p;
}
void set(vector<int> data, int k)
{
node temp = new NODE;
temp->data[0] = data[1];
temp->data[1] = data[2];
insert(temp);
++size;
if (size > k)
{
delF();
}
}
void ConvPri(node var){
if (!(var == head || var == tail->Left))
{
var->Left->Right = var->Right;
var->Right->Left = var->Left;
insert(var);
}
}
int get(int data)
{
head->data[0] = data;
node p = tail->Left;
while (p->data[0] != data)
{
p = p->Left;
}
ConvPri(p);
return p->data[1];
}
vector<int> LRU(vector<vector<int>> &operators, int k)
{
vector<int> data;
for (auto i : operators)
{
if (i[0] == 1)
{
set(i, k);
}
else if (i[0] == 2)
{
data.push_back(get(i[1]));
}
}
return data;
}
};
/*************************************************************
* 函数名 :input
* 作用 :将题目的字符串形式转换成核心代码所需要的输入
* 输入示例 :"[[1,1,1],[1,2,2],[2,1],[1,3,3],[2,2],[1,4,4],[2,1],[2,3],[2,4]],2"
* 输出示例 :vector<int>{1,-1,-1,3,4}
* 驱动模块 :string test = "[[1,1,1],[1,2,2],[2,1],[1,3,3],[2,2],[1,4,4],[2,1],[2,3],[2,4]]";
* input(test);
*************************************************************/
vector<int> input(string s)
{
int k = int(s[s.length() - 1]) - 48;
vector<vector<int>> data = createDoubleVector(s.substr(0, s.length() - 2));
Solution s1;
vector<int> r = s1.LRU(data, k);
return r;
}
int main(int argc, char const *argv[])
{
vector<int> data = input("[[1,1,1],[1,2,2],[2,1],[1,3,3],[2,2],[1,4,4],[2,1],[2,3],[2,4]],2");
for (auto i : data)
{
cout << i << ',';
}
return 0;
}
牛客网 NC93设计LRU缓存结构 完整题解(可下载运行)
最新推荐文章于 2024-10-16 21:03:55 发布