初学python记录:力扣706. 设计哈希映射

题目:

不使用任何内建的哈希表库设计一个哈希映射(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 。

提示:

  • 0 <= key, value <= 106
  • 最多调用 104 次 putget 和 remove 方法

思考:

超大数组

第一眼:这题不是跟昨天的705题差不多吗?......然后用超大数组的写法写了,也通过了:

class MyHashMap(object):def __init__(self):self.hash = [-1] * 1000001def put(self, key, value):""":type key: int:type value: int:rtype: None"""self.hash[key] = valuedef get(self, key):""":type key: int:rtype: int"""return self.hash[key]def remove(self, key):""":type key: int:rtype: None"""self.hash[key] = -1

提交通过:

 

那么用正经哈希函数写呢?

哈希函数+链地址法(定长数组)

即用二维数组的索引代表key值,数值代表value值。设置行数volume为1000,同时也是哈希函数中的除数。哈希函数即:

1. address(key所在的行) =  key % volume,可见address的范围为[0, 999]

2. address_ (key所在的列)= key // self.volume,可见address_的范围为[0, 1000]。所以设置数组的列数为1001。

代码如下:

class MyHashMap(object):def __init__(self):# key的范围:[0, 1000000]self.volume = 1000     # 1000行(代表除数为1000,也代表余数从0到999)self.hashmap = [[-1]*1001 for _ in range(self.volume)]# 1001列(代表整除商,从0到1000)def _hash(self, key):address =  key % self.volume    # 第一层位置(行)address_ = key // self.volume    # 第二层位置(列)return address, address_def put(self, key, value):""":type key: int:type value: int:rtype: None"""address, address_ = self._hash(key)self.hashmap[address][address_] = valuedef get(self, key):""":type key: int:rtype: int"""address, address_ = self._hash(key)return self.hashmap[address][address_]def remove(self, key):""":type key: int:rtype: None"""address, address_ = self._hash(key)self.hashmap[address][address_] = -1

提交通过:

 

【最优】哈希函数+链地址法(变长列表)

 思路跟昨天的题一模一样,只不过向列表中插入的不再是key值,而是[key, value]小数组。代码如下:

class MyHashMap(object):def __init__(self):self.volume = 1000self.hashset = [[] for _ in range(self.volume)]def _hash(self, key):return key % self.volume    # 哈希函数def put(self, key, value):""":type key: int:type value: int:rtype: None"""index = self._hash(key)for item in self.hashset[index]:if item[0] == key:   # 如果key已经存在于映射中,则更新其对应的值 valueitem[1] = valuereturnself.hashset[index].append([key, value])   # 若key还不存在,则插入[key, value]def get(self, key):""":type key: int:rtype: int"""index = self._hash(key)for item in self.hashset[index]:if item[0] == key:return item[1]return -1   def remove(self, key):""":type key: int:rtype: None"""index = self._hash(key)for i, item in enumerate(self.hashset[index]):if item[0] == key:   del self.hashset[index][i]

提交通过:

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/819675.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringCloud之LoadBalancer自定义负载均衡算法,基于nacos权重

LoadBalancer基于Nacos权重自定义负载算法 ReactorLoadBalancer接口&#xff0c;实现自定义负载算法需要实现该接口&#xff0c;并实现choose逻辑&#xff0c;选取对应的节点 public interface ReactorLoadBalancer<T> extends ReactiveLoadBalancer<T> {Mono<…

VMware Workstation部署最新版OpenWrt 23.05.3

正文共&#xff1a;1456 字 51 图&#xff0c;预估阅读时间&#xff1a;2 分钟 我们之前介绍了如何在VMware Workstation上安装OpenWrt&#xff08;软路由是啥&#xff1f;OpenWrt又是啥&#xff1f;长啥样&#xff1f;在VMware装一个瞅瞅&#xff09;&#xff0c;也介绍了如何…

【计算机毕业设计】物流管理系统设计与实现——后附源码

&#x1f389;**欢迎来到琛哥的技术世界&#xff01;**&#x1f389; &#x1f4d8; 博主小档案&#xff1a; 琛哥&#xff0c;一名来自世界500强的资深程序猿&#xff0c;毕业于国内知名985高校。 &#x1f527; 技术专长&#xff1a; 琛哥在深度学习任务中展现出卓越的能力&a…

ubuntu16.04安装Eclipse C/C++

1.安装 JDK 官网源码安装 首先打开JDK官网&#xff0c;JDK1.8的下载网址为&#xff1a;https://www.oracle.com/cn/java/technologies/downloads/#java8-windows&#xff0c;进入到网址如下图所示&#xff1a; 向下滑动到 JDK1.8的下载界面&#xff0c;如下图所示&#xff1a…

3_2Linux中内核级加强型火墙的管理

### 一.Selinux的功能 ### 观察现象 ①当Selinux未开启时 在/mnt中建立文件被移动到/var/ftp下可以被vsftpd服务访问 匿名用户可以通过设置后上传文件 当使用ls -Z /var/ftp查看文件时显示"?" ps auxZ | grep vsftpd 时显示&#xff1a; - root 8546 0.0 0.0 26952 …

四.音视频编辑-音频混合-概述

引言 当我们在前两篇博客中成功地构建了一个媒体组合&#xff0c;并且略过了音频部分时&#xff0c;我们意识到了我们需要对这个项目进行更详细的探讨。在本篇博客中&#xff0c;我们将会展示如何创建一个包含视频轨道、配音音频轨道以及背景音频轨道的完整媒体组合。更进一步…

【GDAL-Python】1-在Python中使用GDAL读写栅格文件

文章目录 1-概要2.代码实现 1-概要 提示&#xff1a;本教程介绍如何使用 Python 中的 GDAL 库将栅格数据读取为数组并将数组另存为GeoTiff 文件 视频地址&#xff1a;B站对应教程 目标&#xff1a; &#xff08;1&#xff09;读写GeoTiff影像&#xff1b; &#xff08;2&…

centos 9 安装mysql 到系统指定目录

在CentOS 9上安装MySQL并将其安装到系统指定目录的步骤如下&#xff1a; 首先&#xff0c;确认已经正确配置了CentOS 9的网络连接。 打开终端并使用root用户登录。 添加MySQL Yum存储库。执行以下命令&#xff1a; dnf install -y https://dev.mysql.com/get/mysql80-communi…

深入理解Java内存模型(JMM)

Java内存模型&#xff08;JMM&#xff09;是每一位Java开发者必须了解的核心知识之一&#xff0c;特别是对于涉足并发编程的开发者来说&#xff0c;JMM是保证多线程程序正确执行的基石。JMM定义了线程与主内存之间的抽象关系&#xff0c;规定了如何通过内存来进行线程间的通信&…

Antd:在文本框中展示格式化JSON

要想将对象转换为格式化 JSON 展示在文本框中&#xff0c;需要用到 JSON.stringify JSON.stringify 方法接受三个参数&#xff1a; value&#xff1a;必需&#xff0c;一个 JavaScript 值&#xff08;通常为对象或数组&#xff09;要转换为 JSON 字符串。replacer&#xff1a…

MySql 安装,小白也可以学会成功安装的保姆级教程

MySql 安装 文章目录 MySql 安装1.Mysql下载1.1 访问下载链接1.2 选择合适版本1.3 下载安装包 2.MySql安装3.安装成功检测验证3.1 mysql自带控制台验证3.2 win系统控制台进入验证 4. mysql 配置path5. navicat 连接 mysql 1.Mysql下载 1.1 访问下载链接 MySQL Downloads 这里…

常用的权限模型介绍

概述 权限模型是一种用于定义和管理系统资源访问权限的规则集合。它规定了谁可以访问系统资源&#xff0c;以及在何种条件下可以访问。 常用的权限模型 DAC&#xff08;Discretionary Access Control&#xff09;&#xff1a;自主访问控制&#xff0c;是基于用户身份或组织属…

【自由看门狗配置及计算】

一、看门狗使用场景 看门狗是一个硬件计时电路&#xff0c;用来监测由软件故障导致的系统故障。 片上有两个看门狗定时器外设&#xff0c;自由看门狗定时器&#xff08;FWDGT也叫独立看门狗&#xff09;和窗口看门狗定时器&#xff08;WWDGT&#xff09;。 当嵌入式程序在运…

conda 创建、激活、退出、删除虚拟环境

一、conda 本地环境常用操作 #获取版本号 conda --version 或 conda -V #检查更新当前conda conda update conda #查看当前存在哪些虚拟环境 conda env list 或 conda info -e #查看--安装--更新--删除包 conda list&#xff1a; conda search package_name# 查询包 cond…

Centos 更换yum国内源的命令 -- yum更新速度太慢问题

【Linux】yum | 更新为国内源 | 删除源 | 删除repo | CentOS7_linux如何删除repo文件-CSDN博客

Linux程序调试优化(1)——内存占用详解及优化思路

文章目录 1.free查看总体的内存占用2./proc/$PID/status 查看某进程状态 linux开发最重要的两个参数&#xff0c;分别是内存以及CPU使用率&#xff0c;若内存出现严重不足&#xff0c;则在需要使用内存时&#xff0c;可能出现申请不到的情况&#xff0c;导致 OOM&#xff0c;L…

不出天府锋巢直播产业基地,即可激活电商直播产业、产教融合及人才培训服务

天府锋巢直播产业基地打造直播产业产教融合及人才培训服务新模式&#xff0c;携手政府、企业、高校&#xff0c;促进直播产业与创新人才双向奔赴&#xff0c;推进教学与实战深度融合&#xff0c;推动实习与就业无缝衔接。 各方资讯一应俱全 直播产业产教融合及人才培训服务全套…

ArrayList扩容

在Java中&#xff0c;ArrayList是一个动态数组&#xff0c;它允许在运行时改变其大小。当向ArrayList添加元素并且当前数组容量不足以容纳新元素时&#xff0c;ArrayList会自动扩容。 扩容原理 初始容量&#xff1a;当创建一个新的ArrayList时&#xff0c;可以指定一个初始容量…

DFS专题:力扣岛屿问题(持续更新)

DFS专题&#xff1a;力扣岛屿问题 开篇 每次做到DFS相关的题目都是直接跳过。蓝桥杯过后痛定思痛&#xff0c;好好学习一下DFS和BFS。先从DFS开始吧。 参考题解&#xff1a;nettee&#xff1a;岛屿类问题的通用解法、DFS 遍历框架 一、岛屿数量 题目链接: 200.岛屿数量 题…

x86_64/amd64和arm64区别

1.概况 x86_64&#xff08;也称为AMD64或x64&#xff09;和ARM64是两种不同的处理器架构&#xff0c;它们在设计理念、应用场景和性能特点上有所区别。 2.设计理念 x86_64架构起源于Intel的x86架构&#xff0c;它是对原始32位x86架构的扩展&#xff0c;增加了对64位计算的支…