初学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.hqwc.cn/news/620723.html

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

相关文章

使用IT-Tools+Cpolar在Windows搭建自己的IT工具箱并实现远程在线使用

文章目录 1. 使用Docker本地部署it-tools2. 本地访问it-tools3. 安装cpolar内网穿透4. 固定it-tools公网地址 本篇文章将介绍如何在Windows上使用Docker本地部署IT- Tools&#xff0c;并且同样可以结合cpolar实现公网访问。 在前一篇文章中我们讲解了如何在Linux中使用Docker搭…

unity——Button组件单击双击长按功能

1.实现单击、双击、长按功能 using UnityEngine; using UnityEngine.Events; using UnityEngine.EventSystems; public class ButtonControl_Click_Press_Double : MonoBehaviour, IPointerClickHandler, IPointerDownHandler, IPointerUpHandler, IPointerExitHandler {publi…

【InternLM 实战营第二期笔记01】书生·浦语大模型全链路开源体系+InternLM2技术报告

本次课程链接在GitHub上&#xff1a;InternLM/Tutorial at camp2 (github.com) 第一次课程录播链接&#xff1a;书生浦语大模型全链路开源体系_哔哩哔哩_bilibili InternLM2技术报告&#xff1a;arxiv.org/pdf/2403.17297.pdf 一、书生浦语大模型全链路开源体系笔记 Intern…

强化学习-Reinforcement learning | RL

目录 什么是强化学习? 强化学习的应用场景 强化学习的主流算法 强化学习是机器学习的一种学习方式,它跟监督学习、无监督学习是对应的。本文将详细介绍强化学习的基本概念、应用场景和主流的强化学习算法及分类。 什么是强化学习? 强化学习并不是某一种特定的算法,而是…

消费增值新模式:让每一分钱都更有价值

亲爱的消费者们&#xff0c;大家好&#xff01;今天我想和大家探讨一种新颖的消费方式——消费增值&#xff0c;它让您的每一次消费都蕴含了额外的价值&#xff0c;让消费变得更加有意义。 在过往的消费观念里&#xff0c;我们往往只是简单地将钱花出去&#xff0c;购买所需的商…

Jmeter —— jmeter利用取样器中http发送请求

使用Jmeter发送HTTP请求 取样器是用来模拟用户操作&#xff0c;向服务器发送请求以及接收服务器的响应数 据的一类元件&#xff0c;其中HTTP请求取样器是用来模拟常用的http请求的 步骤如下&#xff1a; 步骤一&#xff1a;添加线程组 右击测试计划——添加——线程&#x…

ModuleNotFoundError: No module named ‘imageio‘ 解决方案

错误原因&#xff1a; 缺少imageio包导致 解决办法&#xff1a; 1、查看是否安装conda环境&#xff0c;如果未安装就先安装conda环境 conda --version 输出conda版本&#xff1a; 2、输入如下代码 conda config --add channels conda-forge conda install imgaug

带你追踪 ICASSP 2024会议现场 韩国夜景令人陶醉

会议之眼 快讯 昨天&#xff0c;2024年的ICASSP&#xff08;International Conference on Acoustics, Speech, and Signal Processing&#xff09;即国际声学、语音和信号处理会议已经在韩国首尔拉开帷幕&#xff01;吸引了众多热情的与会者&#xff01;本届ICASSP会议举办日期…

J垃圾回收

J垃圾回收 1 概述2 方法区的回收3 如何判断对象可以回收3.1 引用计数法3.2 可达性分析法 4 常见的引用对象4.1 软引用4.2 弱引用4.3 虚引用4.4 终结器引用 5 垃圾回收算法5.1 垃圾回收算法的历史和分类5.2 垃圾回收算法的评价标准5.3 标记清除算法5.4 复制算法5.5 标记整理算法…

【深入理解Java IO流0x0A】NIO实战-网络聊天室

本篇博客将进行NIO编程实战&#xff0c;实现一个简单聊天室。 我们来通过 SocketChannel 和 ServerSocketChannel 实现一个 0.1 版的聊天室&#xff0c;先说一下需求&#xff0c;比较简单&#xff0c;服务端启动监听客户端请求&#xff0c;当客户端向服务器端发送信息后&#x…

如何落地一个FaaS平台?

简介&#xff1a; 函数即服务&#xff08;FaaS&#xff09;作为云计算 2.0 时代重要的发展方向&#xff0c;能够从工程效率、可靠性、性能、成本等方面给开发者带来巨大的价值&#xff0c;尤其是能够极大地提升研发效率。因此&#xff0c;拥抱FaaS成为开发者关心的重要技术领域…

FPGA - 仲裁器的设计实现

一&#xff0c;为什么做仲裁 在多主单从的设计中&#xff0c;当多个源端同时发起传输请求时&#xff0c;这个时候就需要仲裁器来根据优先级来判断响应哪一个源端&#xff0c;向其传输数据。比如&#xff1a;以太网仲裁&#xff0c;DDR仲裁&#xff0c;光纤传图仲裁..... 二&a…