当前位置: 首页 > article >正文

Leetcode 706. 设计哈希映射

1.题目基本信息

1.1.题目描述

不使用任何内建的哈希表库设计一个哈希映射(HashMap)。

实现 MyHashMap 类:

  • MyHashMap() 用空映射初始化对象
  • void put(int key, int value) 向 HashMap 插入一个键值对 (key, value) 。如果 key 已经存在于映射中,则更新其对应的值 value 。
  • int get(int key) 返回特定的 key 所映射的 value ;如果映射中不包含 key 的映射,返回 -1 。
  • void remove(key) 如果映射中存在 key 的映射,则移除 key 和它所对应的 value 。

1.2.题目地址

https://leetcode.cn/problems/design-hashmap/description

2.解题方法

2.1.解题思路

链地址法

2.2.解题步骤

第一步,定义哈希函数的取余的基数和存储数组表data。

第二步,定义哈希函数,本题采用的最简单的除余函数。

第三步,定义插入函数,首先求key的哈希值h,并找到data中h位置的链表,如果key已经在该链表中,则将value进行更新,否则将key、value加入到该链表中。

第四步,定义查找函数,首先求key的哈希值h,并找到data中h位置的链表,如果key已经在该链表中,则返回对应的值,如果不存在,则返回-1。

第五步,定义删除函数,首先求key的哈希值h,并找到data中h位置的链表,如果key已经在该链表中,则删除对应项并返回。

3.解题代码

Python代码

# 链地址法
# 第一步,定义哈希函数的取余的基数和存储数组表data。第二步,定义哈希函数,本题采用的最简单的除余函数。第三步,定义插入函数,首先求key的哈希值h,并找到data中h位置的链表,如果key已经在该链表中,则将value进行更新,否则将key、value加入到该链表中。第四步,定义查找函数,首先求key的哈希值h,并找到data中h位置的链表,如果key已经在该链表中,则返回对应的值,如果不存在,则返回-1。第五步,定义删除函数,首先求key的哈希值h,并找到data中h位置的链表,如果key已经在该链表中,则删除对应项并返回。
class MyHashMap:
    def __init__(self):
        self.base=999
        self.data=[[] for _ in range(self.base)]
    
    def hash(self,key:int):
        return key%self.base

    def put(self, key: int, value: int) -> None:
        hashVal=self.hash(key)
        for item in self.data[hashVal]:
            if item[0]==key:
                item[1]=value
                return
        self.data[hashVal].append([key,value])

    def get(self, key: int) -> int:
        hashVal=self.hash(key)
        for item in self.data[hashVal]:
            if item[0]==key:
                return item[1]
        return -1

    def remove(self, key: int) -> None:
        hashVal=self.hash(key)
        for index,item in enumerate(self.data[hashVal]):
            if item[0]==key:
                self.data[hashVal].pop(index)
                return

4.执行结果

在这里插入图片描述


http://www.kler.cn/a/321842.html

相关文章:

  • mysql每日一题(上升的温度,date数据的计算)
  • 【Linux】Linux 权限的理解
  • Spark RDD中常用聚合算子源码层面的对比分析
  • SQL面试题——蚂蚁SQL面试题 连续3天减少碳排放量不低于100的用户
  • 如何在Mac上切换到JDK 17开发环境
  • 在esxi8.0中安装黑群晖的过程记录及小问题处理
  • 大屏可视化px转rem方案实现
  • webservice cxf框架 jaxrs jaxws spring整合 接口测试方法 wsdl报文详解 springboot整合 拦截器 复杂参数类型
  • 作者分享|eDNA研究梯级水坝对浮游植物和浮游动物群落变化的影响
  • WPF入门教学十九 属性动画与时间线
  • 计算机网络nat 映射案列
  • 基于nodejs+vue的校园二手物品交易系统
  • Vue3+Vite中引用Swiper11自动轮播、左右切换不生效,已解决
  • Android常用C++特性之std::equal
  • 【python append函数的一些细节】
  • 音频转MP3格式困难?如何轻松实现wav转mp3?
  • Vue3中el-table组件实现分页,多选以及回显
  • 基于 STM32 的高精度 PID 温控系统设计与实现:采用 Pt1000 温度传感器与 PWM 控制技术
  • HT5169内置BOOST升压的11W I2S输入D类音频功放
  • 【游戏设计】游戏中需要管理的数据分类
  • MYSQL-查看表中字段属性语法(三)
  • 找质数的方式
  • MATLAB中的无线通信系统测试和验证方法有哪些
  • 代码随想录Day17 图论-1
  • 调和级数枚举+前缀和,CF 731F - Video Cards
  • flutter 设置字体大小,适应各种屏幕