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 @   ARUI丶  阅读(43)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示
主题色彩