0
点赞
收藏
分享

微信扫一扫

LeetCode刷题笔记-706.设计哈希映射

Python百事通 2022-04-14 阅读 72

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);
*/

注意点

  1. 第一次提交不通过,原因是myHashMapPut(...)函数内的hashe(obj,key)手误写了hashe(obj,value),最后通过gdb调了接近十几分钟才定位出来,看代码和写代码证的还是要细心;
  2. 第二次提交超时未通过,后面直接将HMSIZE修改为(1<<20)后通过了,ps:原来的值为(1<<16);

可以进一步优化的点

  1. 动态内存扩展,由于时间关系我就不继续了;
  2. myHashMapFree的释放函数未实现,感觉是个脏苦累活,所以能不写就不写了;
  3. 内存看看有没有更好的方案进行优化,这个需要进一步学习更新的技术;

运行结果

在这里插入图片描述

举报

相关推荐

0 条评论