LeetCode-706-简单哈希映射
题目链接
问题描述
不使用内建的哈希库设计一个哈希映射。
MyHashMap() 用空映射初始化对象。
put(key, value) 向 HashMap 插入一个键值对 (key, value)如果 key 已经存在,则更新其对应的值 value。
get(key) 返回key 所映射的 value;如果不包含 key 的映射,返回 -1 。
remove(key) 如果存在 key 的映射,则移除 key 和它所对应的 value。
要求
最多10^4次put get remove 的调用。
思路
(这题让我学了静态变量, 构造函数初始化列表,list, 和 pair....😂)
-
用链地址法实现,使用C++的 vector 建立哈希表,list 作为链表,pair存储(key, value).
-
哈希函数:
key % 769;
C++代码
class MyHashMap { // 链地址法
public:
vector<list<pair<int, int>>> Map;
static const int base = 769; // 表长
static int hash(int key) { // 哈希函数
return key%base;
}
MyHashMap() : Map(base) {}
void put(int key, int value) {
int h = hash(key);
for (auto it = Map[h].begin(); it != Map[h].end(); it++) { // 遍历链表
if ((*it).first == key) {
(*it).second = value;
return;
}
}
// 当前key的value还没有写入
Map[h].push_back(make_pair(key, value));
}
int get(int key) {
int h = hash(key);
for (auto it = Map[h].begin(); it!=Map[h].end(); it++) {
if ((*it).first == key){
return (*it).second;
}
}
return -1;
}
void remove(int key) {
int h = hash(key);
for (auto it = Map[h].begin(); it != Map[h].end(); it++) {
if ((*it).first == key) {
Map[h].erase(it);
return ;
}
}
}
};