ARST打卡第99周[99/521]

Algorithm-lru实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#include <iostream>
#include <unordered_map>
#include <list>
#include <algorithm>
#include <utility>

using namespace std;

class LRUCache {
private:
unordered_map<int, list<pair<int, int> >::iterator > cache_map;
list<pair<int, int> > cache_list;
int cap;
public:
LRUCache(int cap_v) : cap(cap_v) {}
void put(int key, int val) {
unordered_map<int, list<pair<int, int> >::iterator >::iterator it = cache_map.find(key);
if (it != cache_map.end()) {
// 利用del来赋值
list<pair<int, int> >::iterator del = it->second;
del->second = val;
pair<int, int> tmp = *del;
cache_list.erase(del);
cache_list.push_front(tmp);

cache_map[key] = cache_list.begin();

} else {
pair<int, int> tmp = make_pair(key, val);
if (cache_map.size() >= cap) {
int del_key = cache_list.back().first;
cache_list.pop_back();
unordered_map<int, list<pair<int, int> >::iterator>::iterator del_it =
cache_map.find(del_key);
cache_map.erase(del_it);
}

cache_list.push_front(tmp);
cache_map[key] = cache_list.begin();
}
}

int get(int key) {
int ret_val = -1;
unordered_map<int, list<pair<int, int> >::iterator >::iterator it = cache_map.find(key);
// 找到则返回对应的val
if (it != cache_map.end()) {
ret_val = it->second->second;
// 更新
list<pair<int, int> >::iterator del = it->second;
pair<int, int> tmp = *del;
cache_list.erase(del);
cache_list.push_front(tmp);
cache_map[key] = cache_list.begin();
}
return ret_val;
}
};

int main() {
LRUCache cache( 2 /* 缓存容量 */ );
cache.put(1, 1);
cache.put(2, 2);
cout << cache.get(1) << endl; // 返回 1
cache.put(3, 3); // 该操作会使得关键字 2 作废
cout << cache.get(2) << endl; // 返回 -1 (未找到)
cache.put(4, 4); // 该操作会使得关键字 1 作废
cout << cache.get(1) << endl; // 返回 -1 (未找到)
cout << cache.get(3) << endl; // 返回 3
cout << cache.get(4) << endl; // 返回 4
cout << "Hello World!" << endl;
}

Review

20岁,我们要明白的道理

相信自己求证的东西,相信自己一定能变得更好

不要相信任何人,包括自己,然后去保持疑惑,去求证疑惑,最终相信自己求证出来的东西,然后不断实践,让自己变得更好

Tips

memcpy与memmove的区别

Share-前中后序非递归二叉树遍历

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
/*
共同点:
- 用栈模拟递归
- 都是在为根时输出

*/
#include <algorithm>
#include <iomanip>
#include <iostream>
#include <stack>

using namespace std;

typedef struct bt_node {
int data;
struct bt_node* lchild;
struct bt_node* rchild;
} bt_node_t;

void pre_order_without_dfs(bt_node_t* root) {
// 空树
if (!root)
return;

bt_node_t* p = root;
stack<bt_node_t*> s;
while (!s.empty() || p) {
if (p) {
/* 根---后面的左,右变成根的时候也走这里 */
cout << setw(4) << p->data;
s.push(p);
p = p->lchild;
} else {
/* 右 */
p = s.top();
s.pop();
p = p->rchild;
}
}
cout << endl;
}

void in_order_whitout_dfs(bt_node_t* root) {
if (!root)
return;

bt_node_t* p = root;
stack<bt_node_t*> s;
while (!s.empty() || p) {
// 左和根都放进去--先根后左,正好可以出栈先左后根
if (p) {
s.push(p);
p = p->lchild;
} else {
p = s.top();
s.pop();
cout << setw(4) << p->data;
p = p->rchild;
}
}
cout << endl;
}

void last_order_whitout_dfs(bt_node_t* root) {
if (!root)
return;

stack<bt_node_t*> s;
/* 记录当前访问节点 和 上次访问节点 */
bt_node_t* p_cur, * p_last_visit;

p_cur = root;
p_last_visit = NULL;

/* 先把cur移动到最左边,并且把根都记录 */
while (p_cur) {
s.push(p_cur);
p_cur = p_cur->lchild;
}

while (!s.empty()) {
/* 每次都while到没有,所以这里的p_cur为空 */
p_cur = s.top();
s.pop();

/* 左边访问完了,现在看右边没有 or 已经访问过的情况 */
if (p_cur->rchild == NULL || p_cur->rchild == p_last_visit) {
/* 现在可以输出根了 */
cout << setw(4) << p_cur->data << endl;
p_last_visit = p_cur;
} else {
/* 有右节点且未被访问 */
s.push(p_cur);
/* 进入右子树访问 */
p_cur = p_cur->rchild;
while (p_cur) {
s.push(p_cur);
p_cur = p_cur->lchild;
}
}
}
cout << endl;
}

int main() {

return 0;
}