java关于hashmap编程题_LeetCode算法题-Design HashMap(Java实现)

这是悦乐书的第299次更新,第318篇原创

01 看题和准备

今天介绍的是LeetCode算法题中Easy级别的第167题(顺位题号是706)。在不使用任何内置哈希表库的情况下设计HashMap。具体而言,你的设计应包括以下功能:

put(key,value):将一个(key,value)对插入HashMap。如果该值已存在于HashMap中,请更新该值。

get(key):返回指定键映射到的值,如果此映射不包含键的映射,则返回-1。

remove(key):如果此映射包含键的映射,则删除值键的映射。

例如:

MyHashMap hashMap = new MyHashMap();

hashMap.put(1,1);

hashMap.put(2,2);

hashMap.get(1); //返回1

hashMap.get(3); //返回-1(未找到)

hashMap.put(2,1); //更新现有值

hashMap.get(2); //返回1

hashMap.remove(2); //删除2的映射

hashMap.get(2); //返回-1(未找到)

注意:

所有key和value都将在[0,1000000]范围内。

操作次数将在[1,10000]范围内。

请不要使用内置的HashMap库。

本次解题使用的开发工具是eclipse,jdk使用的版本是1.8,环境是win7 64位系统,使用Java语言编写和测试。

02 第一种解法

为了实现键值对的效果,内层使用了二维数组,外层使用ArrayList。其中二维数组是一个一行两列的结构,第一行第一列存储key的值,第一行第二列存储value的值。另外,我们还需要单独写一个contains方法,来判断当前的key是否存在于HashMap中。

put方法的时间复杂度为O(n),get方法的时间复杂度为O(n),remove的时间复杂度为O(n),contains方法的时间复杂度为O(n)。

class MyHashMap {

List list;

/** Initialize your data structure here. */

public MyHashMap() {

list = new ArrayList();

}

/** value will always be non-negative. */

public void put(int key, int value) {

if (contains(key)) {

for (int[][] arr : list) {

if (arr != null && arr[0][0] == key) {

arr[0][1] = value;

break;

}

}

} else {

list.add(new int[][]{{key, value}});

}

}

public boolean contains(int key){

for (int[][] arr : list) {

if (arr != null && arr[0][0] == key) {

return true;

}

}

return false;

}

/** Returns the value to which the specified key is mapped, or -1 if this map contains no mapping for the key */

public int get(int key) {

for (int[][] arr : list) {

if (arr != null && arr[0][0] == key) {

return arr[0][1];

}

}

return -1;

}

/** Removes the mapping of the specified value key if this map contains a mapping for the key */

public void remove(int key) {

if (contains(key)) {

for (int i=0; i

if (list.get(i)[0][0] == key) {

list.remove(i);

break;

}

}

}

}

}

/**

* Your MyHashMap object will be instantiated and called as such:

* MyHashMap obj = new MyHashMap();

* obj.put(key,value);

* int param_2 = obj.get(key);

* obj.remove(key);

*/

03 第二种解法

我们也可以使用一个小track,依旧使用数组,但是变成了一维数组,因为题目给定了key和value的范围,所以数组的容量为其最大范围加1。因为最小值可以为0,而数组默认值是0,避免误判,将数组的初始值全部赋值为-1。

put方法的时间复杂度为O(1),get方法的时间复杂度为O(1),remove的时间复杂度为O(1),但是空间复杂度较高。

class MyHashMap {

int[] arr;

/** Initialize your data structure here. */

public MyHashMap() {

arr = new int[1000001];

Arrays.fill(arr, -1);

}

/** value will always be non-negative. */

public void put(int key, int value) {

arr[key] = value;

}

/** Returns the value to which the specified key is mapped, or -1 if this map contains no mapping for the key */

public int get(int key) {

return arr[key];

}

/** Removes the mapping of the specified value key if this map contains a mapping for the key */

public void remove(int key) {

arr[key] = -1;

}

}

/**

* Your MyHashMap object will be instantiated and called as such:

* MyHashMap obj = new MyHashMap();

* obj.put(key,value);

* int param_2 = obj.get(key);

* obj.remove(key);

*/

04 第三种解法

class MyHashMap {

/** Initialize your data structure here. */

ListNode[] nodes;

public MyHashMap() {

nodes = new ListNode[10000];

}

/** value will always be non-negative. */

public void put(int key, int value) {

int idx = key%10000;

if(nodes[idx]==null){

nodes[idx] = new ListNode(-1,-1);

nodes[idx].next = new ListNode(key,value);

}else{

ListNode pre = find(nodes[idx], key);

if(pre.next == null){

pre.next = new ListNode(key, value);

}else{

pre.next.value = value;

}

}

}

/** Returns the value to which the specified key is mapped, or -1 if this map contains no mapping for the key */

public int get(int key) {

int idx = key%10000;

if(nodes[idx] == null) return -1;

else{

ListNode pre = find(nodes[idx], key);

if(pre.next == null) return -1;

else return pre.next.value;

}

}

public ListNode find(ListNode root, int key){

ListNode pre = null;

ListNode cur = root;

while(cur!=null && cur.key != key){

pre = cur;

cur = cur.next;

}

return pre;

}

/** Removes the mapping of the specified value key if this map contains a mapping for the key */

public void remove(int key) {

int idx = key%10000;

if(nodes[idx] == null) return;

else{

ListNode pre = find(nodes[idx], key);

if(pre.next == null) return;

else{

pre.next = pre.next.next;

}

}

}

class ListNode{

int key;

int value;

ListNode next;

ListNode(int key, int value){

this.key = key;

this.value = value;

}

}

}

/**

* Your MyHashMap object will be instantiated and called as such:

* MyHashMap obj = new MyHashMap();

* obj.put(key,value);

* int param_2 = obj.get(key);

* obj.remove(key);

*/

05 小结

算法专题目前已日更超过四个月,算法题文章167+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。

以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!

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

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

相关文章

Nature:1000种植物的测序揭示10亿年来的进化

来源:生物通千种植物转录组计划(1,000 Plants Project,1KP)是由加拿大科学家在2008年11月发起的,召集了将近200名植物学家对1,100多种植物的基因进行测序和分析。如今,这个项目的研究成果发表在《Nature》杂…

CodeForces 688B - Lovely Palindromes(思路)

题意&#xff1a;输出第n&#xff08;1 < n < 10^100000&#xff09;大的偶数长度的回文数。&#xff08;最小的为11&#xff09; 因为长度是偶数&#xff0c;所以前后两半之间是相互对称的&#xff0c;又因为一个数字的大小主要取决于较高位数的大小&#xff0c;所以数字…

python 查询sqlserver 视图_SQL Server 2017 数据库教与学(教学大纲,含Python+SQL Server案例)...

原标题&#xff1a;SQL Server 2017 数据库教与学(教学大纲&#xff0c;含PythonSQL Server案例)本书提供PythonSQL Server案例SQL Server教学大纲一、课程的性质和教学目的课程性质&#xff1a;数据库技术是各类信息系统、管理系统的基础。SQL Server数据库是微软公司的一款数…

java 通过反射得到命名空间_利用反射得到一个命名空间下的所有类,并调用?...

当年话下Assembly.LoadFrom("assemblyName").GetTypes();Assembly.Load("assemblyName").GetTypes();遍历&#xff0c; 再通过Type.GetInterface(""),如果结果不为null&#xff0c;那就说明找到了再Activator.CreateInstance(“”)即可还是写段代…

量子霸权之争

来源&#xff1a; 原理这一个月以来&#xff0c;量子计算机领域吸引了许多人的关注&#xff0c;因为关于谷歌已经实现了人们期待已久的里程碑——“量子霸权”&#xff08;也被称为”量子优越性“&#xff09;的消息不胫而走。“量子霸权”是加州理工学院的理论物理学家John Pr…

Atitit 通过调用gui接口杀掉360杀毒 360卫士  qq保镖等难以结束的进程(javac# php )...

Atitit 通过调用gui接口杀掉360杀毒 360卫士 qq保镖等难以结束的进程(javac# php ) 1.1. 这些流氓软件使用操作系统os提供的普通api根本就杀不掉啊1 1.2. 使用他们自己的api 或者cli接口来关闭1 1.3. 通过gui接口杀进程&#xff1a;&#xff1a;1 1.4. 首先&#xff0c;调用g…

主成分分析法案例_因子分析案例及操作解析

分析一个省的科技创新能力受哪些潜在因素的影响&#xff1f;&#xff08;本数据来源于网络收集&#xff0c;x1~x15代表各省市相关经济指标&#xff09;第一步&#xff1a;数据输入&#xff08;如下图&#xff09;第二步&#xff1a;操作步骤&#xff1a;分析——降维——因子分…

date js 半年_js Date 日期使用上的一个坑

作者&#xff1a;坚强一点链接&#xff1a;https://zhuanlan.zhihu.com/p/22253858来源&#xff1a;知乎著作权归作者所有。商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处。在写js 日历插件的时候遇到一个奇怪的情况。日历当前的日期是 2016-08-31 号 用 js Da…

IBM人工智能将“掌舵”全球首个跨大西洋自主驾驶船舶

来源&#xff1a;IBM中国IBM提供IBM Systems、AI、云以及边缘计算技术&#xff0c;“掌舵”全球首个跨大西洋的自主航行任务目标是拓展人类对于海洋的认识&#xff0c;以及消除海洋研究的障碍此次航行将帮助科学家们了解海洋塑料堆积这一重大社会问题日前&#xff0c;IBM THINK…

用css、html编写一个两列布局的网页,名称为css.html ,要求左侧宽度为200px ,右侧自动扩展...

<body><div style" float:left; width:200px; height:300px; border: 1px #0033FF solid;">111</div><div style" float:left; width:auto; height:300px; border: 1px #0033FF solid;">222</div></body>或者&#x…

python 导入数据对不齐_[Python] 大文件数据读取分析

首先我们可以确定的是不能用read()与readlines()函数&#xff1b;因为如果将这两个函数均将数据全部读入内存&#xff0c;会造成内存不足的情况。针对数据按行划分的文件以计算行数为例&#xff0c;首先针对几种不同的方法来作比较&#xff1a;1、使用for遍历的方法&#xff0c…

【周末阅读】人工智能时代基础数据服务大有可为

来源&#xff1a;青岛智能产业技术研究院智能产业 前沿高地【导读】为机器学习算法训练、优化提供数据采集、标注等服务的人工智能基础数据服务成为这一人工智能热潮中必不可少的一环。如果说计算机工程师是AI的老师&#xff0c;那基础数据服务就是老师手中的教材。人工智能基础…

c#FileStream文件读写(转)

FileStream对象表示在磁盘或网络路径上指向文件的流。这个类提供了在文件中读写字节的方法&#xff0c;但经常使用StreamReader或StreamWriter执行这些功能。这是因为FileStream类操作的是字节和字节数组&#xff0c;而Stream类操作的是字符数据。字符数据易于使用&#xff0c;…

python能处理图片吗_python 能处理图像?

答案是&#xff1a;完全ojbkpython具有强大的图像处理功能&#xff0c;这归功于他 的PIL模块与我们平时所见的使用PS等软件P图有所不同&#xff0c;python实现的图像处理是以代码的形式完成工作&#xff0c;也是千峰这篇文章要说的。需要相关学习资料请关注我操作环境&#xff…

python3多线程编程_Python 3-多线程编程

Python 3-多线程编程运行多个线程类似于同时运行多个不同的程序&#xff0c;但具有以下优点-进程中的多个线程与主线程共享相同的数据空间&#xff0c;因此与单独的进程相比&#xff0c;可以更轻松地共享信息或彼此通信。线程有时被称为轻量级进程&#xff0c;它们不需要太多的…

物理史2000年来最精彩的对决!

来源&#xff1a;工程客背景&#xff1a;在20世纪初&#xff0c;物理学界诞生了影响至今的两大理论&#xff0c;这两个门派&#xff0c;一个是爱因斯坦以一人之力提出的相对论&#xff0c;另一个则是由玻尔领导的哥本哈根学派合力塑成的量子力学。而因为观念的差异&#xff0c;…

sql多行合成一行的解决方法

转载于:https://www.cnblogs.com/shanhuashuiqing11/p/6000627.html

动态改变eachers图表高_让你的Excel图表动起来

有读者提了这样一个问题&#xff0c;想要制作如下的动态图表&#xff0c;要怎么实现&#xff1f;动态图表展示.gif可以看到&#xff0c;这个动态效果里有4种选择器&#xff0c;左上方的组合框呈现出选择不同的方案展示相应柱形图的效果&#xff1b;中间的复选框勾上显示差额的图…

pythonxlwt行居中_python3-xlwt-Excel设置(字体大小、颜色、对齐方式、换行、合并单元格、边框、背景、下划线、斜体、加粗)...

# coding:utf-8import patterns as patternsimport xlwtimport timei 0book xlwt.Workbook(encodingutf-8)sheet book.add_sheet(sheet1, cell_overwrite_okTrue)# 如果出现报错&#xff1a;Exception: Attempt to overwrite cell: sheetnamesheet1 rowx0 colx0# 需要加上&a…

2018-2020年Gartner战略科技发展趋势一览!

来源&#xff1a;边缘计算社区近日&#xff0c;Gartner公布了2020年十大战略科技趋势的预测&#xff0c;值此之际&#xff0c;边缘计算社区总结回顾并简要分析了2018-2020三年的战略科技发展趋势变化。Gartner将战略科技发展趋势定义为具有巨大颠覆性潜力、脱离初期阶段且影响范…