Loading

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....😂)

  1. 用链地址法实现,使用C++的 vector 建立哈希表list 作为链表pair存储(key, value).

  2. 哈希函数: 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 ;
            }
        }
    }
};
posted @ 2022-01-11 13:40  ARUI丶  阅读(43)  评论(0编辑  收藏  举报