LeetCode刷题笔记-706.设计哈希映射
C代码
#define HMSIZE (1<<20)
typedef struct entry_st {
int key;
int value;
struct entry_st *next;
} Entry;
typedef struct {
Entry **data;
int cap;
int size;
} MyHashMap;
MyHashMap* myHashMapCreate() {
MyHashMap *m = NULL;
m = calloc(1, sizeof(MyHashMap));
m->cap = HMSIZE;
m->size = 0;
m->data = calloc(m->cap, sizeof(Entry *));
return m;
}
int hash(MyHashMap* obj, int key) {
return key % HMSIZE;
}
Entry* hashe(MyHashMap* obj, int key) {
return obj->data[hash(obj, key)];
}
Entry* getnode(MyHashMap* obj, int key) {
Entry *head = NULL;
head = hashe(obj, key);
while(head != NULL) {
if(head->key == key) {
return head;
}
}
return NULL;
}
void myHashMapPut(MyHashMap* obj, int key, int value) {
Entry *pre = NULL;
Entry *head = hashe(obj, key);
if(head == NULL) {
head = calloc(1, sizeof(Entry));
head->key = key;
head->value = value;
obj->data[hash(obj,key)] = head;
return;
}
pre = head;
while(head != NULL) {
if(head->key == key) {
head->value = value;
return;
}
pre = head;
head = head->next;
}
head = calloc(1, sizeof(Entry));
head->key = key;
head->value = value;
pre->next = head;
return;
}
int myHashMapGet(MyHashMap* obj, int key) {
Entry *head = NULL;
head = getnode(obj, key);
if (head != NULL) {
return head->value;
}
return -1;
}
void myHashMapRemove(MyHashMap* obj, int key) {
Entry *pre = NULL;
Entry *head = hashe(obj, key);
if(head == NULL)
return;
pre = head;
while(head != NULL) {
if (head->key == key) {
if(pre != head) {
pre->next = NULL;
free(head);
head = NULL;
return;
} else {
obj->data[hash(obj, key)] = NULL;
free(pre);
pre = NULL;
head = NULL;
return;
}
pre = head;
head = head->next;
}
}
return;
}
void myHashMapFree(MyHashMap* obj) {
}
/**
* Your MyHashMap struct will be instantiated and called as such:
* MyHashMap* obj = myHashMapCreate();
* myHashMapPut(obj, key, value);
* int param_2 = myHashMapGet(obj, key);
* myHashMapRemove(obj, key);
* myHashMapFree(obj);
*/
注意点
- 第一次提交不通过,原因是
myHashMapPut(...)
函数内的hashe(obj,key)
手误写了hashe(obj,value)
,最后通过gdb调了接近十几分钟才定位出来,看代码和写代码证的还是要细心; - 第二次提交超时未通过,后面直接将
HMSIZE
修改为(1<<20)
后通过了,ps:原来的值为(1<<16)
;
可以进一步优化的点
- 动态内存扩展,由于时间关系我就不继续了;
- myHashMapFree的释放函数未实现,感觉是个脏苦累活,所以能不写就不写了;
- 内存看看有没有更好的方案进行优化,这个需要进一步学习更新的技术;