LeetCode算法题-Design HashMap(Java实现)

ZYNQ PL通过EMIO ETHE1外接PHY由GMII转RGMII 1,设置EMIO方式引出ETHE1 2,从GMII过度到RGMII GMII: 发送 gmii_tx_clk gmii_tx_d[7:0] gmii_tx_en gmii_tx_er 接收 gmii_rx_clk gmii_rx_d[7:0] gmii_rx_dv gmii_rx_er RGMII: 发送 tx_clk tx_d[3:0] tx_ctrl 接收 rx_clk rx_d[3:0] rx_ctrl 首先数据总线从时钟单边沿采样8bit转变为了双边沿采样4bit,从88E1 阅读详情

这是悦乐书的第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<int[][]> list;
    /** Initialize your data structure here. */
    public MyHashMap() {
        list = new ArrayList<int[][]>();
    }

    /** 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<list.size(); 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 第三种解法

使用单链表,此解法是参考至讨论区。传送门:https://leetcode.com/problems/design-hashmap/discuss/227081/Java-Solutions

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+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。

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

基于FPGA的FIR数字滤波器设计 clear;close all fc=1/4;fs=5/16; %输入给定指标 Rp=3;As=60;Fs=2; f=[fc,fs];m=[1,0]; %计算remezord函数所需参数f,m,dev dev=[(10^(Rp/20)-1)/(10^(Rp/20)+1),10^(-As/20)]; [N,fo,mo,W]=remezord(f,m,dev,Fs); %确定remez函数所需参数 hn=remez(N,fo,mo,W);... 阅读详情

相关推荐

GROMACS+PLUMED联合安装避坑指南:为什么你的plumed patch总是失败?

本文深入解析GROMACS与PLUMED联合安装中补丁失败的常见原因,并提供详细的避坑指南。针对版本兼容性、环境配置和编译选项等关键问题,给出从源码选择、环境搭建到手动合并补丁的完整解决方案,帮助用户成功整合这两个强大的分子动力学工具,实现增强采样模拟。

weixin_29302047的博客 290

Leetcode——设计HashMap

1. 题目 2. 题解 (1)数组 由于题目限定了数据范围 0 <= key, value <= 106 ,和 key,value 的数据类型。 class MyHashMap { int INF = Integer.MAX_VALUE; int N = 1000009; int[] map = new int[N]; public MyHashMap() { Arrays.fill(map, INF); } publi

Yawn 291

Keil5与ARM编译器V5安装指南:从下载到配置全流程解析

本文提供Keil5与ARM Compiler V5的完整安装与配置指南。针对新版Keil5默认不包含V5编译器导致老工程编译失败的问题,详细解析了从软件下载、授权管理到获取并正确安装ARM Compiler V5(AC5)的全流程,确保开发者能顺利搭建兼容老项目的稳定开发环境。

weixin_29158047的博客 878

大厂必问17个HashMap题

1、介绍下 HashMap 的底层数据结构吧 我们现在用的都是 JDK 1.8,底层是由“数组+链表+红黑树”组成,如下图,而在 JDK 1.8 之前是由“数组+链表”组成。 2、为什么要改成“数组+链表+红黑树”? 主要是为了提升在 hash 冲突严重时(链表过长)的查找性能,使用链表的查找性能是 O(n),而使用红黑树是 O(logn)。 3、那在什么时候用链表?什么时候用红黑树? a、对于插入,默认情况下是使用链表节点。当同一个索引位置的节点在新增后达到9个(阈值8):如果此时数组长度大于等于 64,

qq_40205337的博客 233

XPe开发初体验(一)XPe概述

XP Embedded是微软Windows Embedded产品线中非常重要的一环,不过比起大名鼎鼎的Windows Embedded CE,XPe显得过于低调了。在接下来的一段时间里,我希望能够用六篇的篇幅来描述一下XPe的整个开发过程。这个系列文章主要是针对有Windows编程经验,但是没有嵌入式开发经验的开发者,提供一些概念和开发过程的初步介绍。XP Embedded是一个基于Windo

aawolf = new Mobile.MVP 1万+

Endnote 导入参考文献的时候,格式错误太多了。et.al错误,国标GBT7714在endnote中的详细配置教程,适用于本科,硕士论文文献插入的模板

EndNote插入文献常遇到以下错误主要如下: 等、et al不分; 英文作者全名大写; 期刊名字使用了缩写(图片里没有体现;卷号、期号缺失时出现乱码,多了半个括号;页码范围略去了相同部分;没有悬挂缩进,本文全部解决,全网最细

sakura的博客 3万+

leetcode刷题(Java)哈希表

哈希表题目

weixin_62599865的博客 257

微信支付V2,jsapi支付拉起收银台报错:调用支付JSAPI缺少参数:total_fee

拉起收银台报错

m0_54355172的博客 3873

java数据结构(哈希表—HashMap)含LeetCode例题讲解

HashMap 是一个散列表,它存储的内容是键值(key-value)映射。 HashMap 的 key 与 value 类型可以相同也可以不同,根据定义,不受限制。

m0_65277261的博客 2348

手把手教你使用ESM-2进行蛋白质结构预测:从安装到实战

本文详细介绍了如何使用ESM-2蛋白质语言模型进行蛋白质结构预测,从环境准备、模型安装到实战应用。通过逐步指导,读者可以掌握ESM-2的配置、单序列预测、结果可视化及高级优化技巧,适用于生物信息学研究和药物开发。

weixin_29306875的博客 536

史上最全HashMap面试题汇总

1.HashMap的数据结构? 哈希表结构(链表散列:数组+链表)实现,结合数组和链表的优点。当链表长度超过8时,链表转换为红黑树。 2.HashMap的工作原理? HashMap底层是hash数组和单向链表实现,数组中的每个元素都是链表,由Node内部类(实现Map.Entry<K,V>接口)实现,HashMap通过put&get方法存储和获取。 存储对象时,将K/V键值传给put()方法: ①、调用hash(K)方法计算K的hash值,然后结合数组长度,计算得数组下标;

一蓑烟雨任平生 2万+

【车载以太网】Eth Stack Bringup

摘要:本文基于AUTOSAR架构,详细介绍了在TC3xx硬件平台上实现EthStack Bringup的全过程。作者通过配置MCAL和Davinci工具,完成了EthTrcv、Eth、EthIf、EthSM和TcpIp等模块的集成,并解决了16字节内存对齐和以太网速率不匹配等问题。最终实现了PC端与开发板的Ping通,并通过WireShark验证了数据包收发。文章总结了调试中的关键问题与解决方案,强调了实践的重要性,为后续EthStack的深入分析奠定了基础。

qq_36056498的博客 184

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

这是悦乐书的第299次更新,第318篇原创01 看题和准备今天介绍的是LeetCode算法题中Easy级别的第167题(顺位题号是706)。在不使用任何内置哈希表库的情况下设计HashMap。具体而言,你的设计应包括以下功能:put(key,value):将一个(key,value)对插入HashMap。如果该值已存在于HashMap中,请更新该值。get(key):返回指定键映射到的值,如果此映...

weixin_39531594的博客 301

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

LeetCode 706. Design HashMap

Description: Design a HashMap without using any built-in hash table libraries. To be specific, your design should include these functions: put(key, value) : Insert a (key, value) pair into the HashMap. If the value already exists in the HashMap, update the

村里的原振侠的博客 289

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

LeetCode 706. Design HashMap (设计哈希映射)

题目标签:HashMap   题目让我们设计一个 hashmap, 有put, get, remove 功能。   建立一个 int array, index 是key, 值是 value,具体看code。 Java Solution: Runtime: 76 ms, faster than 27.53% Memory Usage: 58.2 MB, less than 31.5...

weixin_30394251的博客 142

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

leetcode 706. Design HashMap

用列表构建: class MyHashMap { class Node{ int key; int value; public Node(int key,int value){ this.key = key; this.value = value; } } Lis...

xiaobailaji的博客 159

leetcode (Design HashMap)

Title:Design HashMap   706 Difficulty:Easy 原题leetcode地址: https://leetcode.com/problems/design-hashmap/   1.  见代码 时间复杂度:O(1)。 空间复杂度:O(n),申请数组。 public class HashTable0706DesignHashMap { /**...

hsx1612727380的专栏 230

[leetcode]706. Design HashMap设计HashMap

Design a HashMapwithout using any built-in hash table libraries. To be specific, your design should include these functions: put(key, value):Insert a (key, value) pair into the HashMap. If the ...

weixin_30399821的博客 104

LeetCode #706 - Design HashMap

题目描述: Design a HashMap without using any built-in hash table libraries. To be specific, your design should include these functions: • put(key, value) : Insert a (key, value) pair into the HashMap. ...

LawFile的博客 178

[leetcode] 706. Design HashMap

Description Design a HashMap without using any built-in hash table libraries. To be specific, your design should include these functions: put(key, value) : Insert a (key, value) pair into the HashMap. If the value already exists in the HashMap, update the

Learning from the mistakes 238

LeetCode 706:设计哈希映射 Design HashMap

LeetCode 706:设计哈希映射 Design HashMap 题目: 不使用任何内建的哈希表库设计一个哈希映射 具体地说,你的设计应该包含以下的功能 put(key, value):向哈希映射中插入(键,值)的数值对。如果键对应的值已经存在,更新这个值。 get(key):返回给定的键所对应的值,如果映射中不包含这个键,返回-1。 remove(key):如果映射中存在这个键,删除这个...

爱写Bug 255

LeetCode(705 & 706):设计哈希集合 & 设计哈希映射 Design HashSet & HashMap(Java)

2019.11.10 #程序员笔试必备# LeetCode 从零单刷个人笔记整理(持续更新) github:https://github.com/ChopinXBP/LeetCode-Babel 数据结构题,应知应会。 HashSet可以用二维数组进行动态开辟空间,避免直接开辟过大的一维数组造成资源浪费。 HashMap容量初始为16,需要考虑负载,一旦数量-容量比大于负载系数(0.75),进行...

NJU_ChopinXBP的博客 572

LeetCode 706:Design HashMap 实现一个简单的哈希映射

题目描述: Design a HashMap without using any built-in hash table libraries. To be specific, your design should include these functions: put(key, value): Insert a (key, value) pair into the HashMap. If...

Just do it ! 2106

从游戏疲劳到数字断舍离:如何识别并管理不再带来快乐的数字产品

游戏疲劳是数字产品使用中的常见现象,其本质源于行为心理学中的可变比率奖励机制和沉没成本效应。当用户长期参与某个数字产品时,大脑会形成习惯性依赖,但实际体验价值可能逐渐降低。从技术角度看,这涉及到用户参与度算法与产品留存策略的设计原理。通过建立数字消费审计机制,可以量化评估时间投入与情感回报的平衡关系。在游戏领域,这种分析可应用于识别健康游戏边界,比如设定单次会话不超过90分钟的时间管理策略。数字断舍离的核心价值在于帮助用户从被动消费转向主动管理,当《植物大战僵尸2》这类长期运营游戏从娱乐变成负担时,采用使用

weixin_34200628的博客 392

java哈希映射_LeetCode 706:设计哈希映射 Design HashMap

题目:不使用任何内建的哈希表库设计一个哈希映射具体地说,你的设计应该包含以下的功能put(key, value):向哈希映射中插入(键,值)的数值对。如果键对应的值已经存在,更新这个值。get(key):返回给定的键所对应的值,如果映射中不包含这个键,返回-1。remove(key):如果映射中存在这个键,删除这个数值对。Design a HashMap without using any bui...

weixin_35480435的博客 247
上一篇: LeetCode算法题-Design HashSet(Java实现)
下一篇: LeetCode算法题-Design LinkedList(Java实现)
程序员小川
博客等级 码龄10年 47粉丝 305原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值