《零基础Go语言算法实战》【题目 4-10】在不使用任何内置散列表库的情况下设计一个 HashMap

server/2025/1/18 3:57:17/

《零基础Go语言算法实战》

【题目 4-10】在不使用任何内置散列表库的情况下设计一个 HashMap

请实现一个 HashMap 类,该类的方法如下。

● HashMap() :使用空映射初始化对象。

● void Put(int key, int value) :将键值对插入到 HashMap 中。如果键已经存在于映射中,

则更新相应的值。

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

● void Remove(key) :如果映射包含键的映射,则删除键及其对应的值。

【解答】

① 思路。

根据题意,通过散列表思想编写 HashMap 对象即可。

② Go 语言实现。

package main

import "fmt"

const (

 mod = 1024

)

type HashMap struct {

 set [mod]*listNode

}

type listNode struct {

 key int

 val int

 next *listNode

}

// 初始化数据结构

func Constructor() HashMap {

 arr := [mod]*listNode{}

 return HashMap{set: arr}

}

func (hm *HashMap) Put(key int, value int) {

 i := key % mod

 ptr := hm.set[i]

 for ptr != nil {

 if ptr.key == key {

 ptr.val = value

 return

 } else {

 ptr = ptr.next

 }

 }

 node := &listNode{key: key, val: value, next: hm.set[i]}

 hm.set[i] = node

}

// 返回指定键映射到的值,如果不包含键的映射,则返回 -1

func (hm *HashMap) Get(key int) int {

 ptr := hm.set[key%mod]

 for ptr != nil {

 if ptr.key == key {

 return ptr.val

 } else {

 ptr = ptr.next

 }

 }

 return -1

}

// 如果 HashMap 映射包含键的映射,则删除键及其对应的值

func (hm *HashMap) Remove(key int) {

 i := key % mod

 ptr := hm.set[i]

 prev := &listNode{next: ptr}

 head := prev

 for ptr != nil {

 if ptr.key == key {

 prev.next = ptr.next

 break

 } else {

 prev = prev.next

 ptr = ptr.next

 }

 }

 hm.set[i] = head.next

}

func main() {

 obj := Constructor()

 obj.Put(1, 1)

 obj.Put(2, 2)

 res1 := obj.Get(1)

 fmt.Println(res1)

 res2 := obj.Get(2)

 fmt.Println(res2)

 obj.Remove(2)

}

//$ go run interview4-10.go

//1

//2


http://www.ppmy.cn/server/158962.html

相关文章

【蓝桥杯】Python算法——快速幂

零、前言 距离25年蓝桥杯还有大概三个月时间,接下来重点应该会放在蓝桥杯备考方向,一起努力,一起加油 一、快速幂 如何快速求 a b p a^bp abp?如果直接循环aaa…毫无疑问时间复杂度是很大的,那么怎么降低计算量呢&…

抢十八游戏

前言 我国民国一直流传着一个名叫“抢十八”的抢数游戏:参与游戏的两人从1开始轮流报数,每次至少报1个数,最多报2个数,每人报的每个数不得与自已报过的或对方报过的重复,也不得跳过任何一个数。谁先报到18&#xff0c…

Golang笔记——协程同步

大家好,这里是Good Note,关注 公主号:Goodnote,专栏文章私信限时Free。本文详细介绍Golang的协程同步的实现和应用场景。 文章目录 协程同步是什么?为什么需要协程同步?常见的协程同步机制互斥锁&#xff0…

服务器宕机原因?该怎么处理?

在信息技术飞速发展的今天,服务器作为数据存储和处理的核心枢纽,其稳定性至关重要。一旦服务器宕机,可能会导致业务中断、数据丢失等严重后果,给企业和用户带来巨大损失。因此,了解服务器宕机的原因并掌握相应的处理方…

NAT技术

NAT技术 1. NAT原理 NAT(Network Address Translation,网络地址转换)是用于在本地网络中使用私有地址,在连接互联网时转而使用全局 IP 地址的技术。NAT实际上是为解决IPv4地址短缺而开发的技术。路由器构建了子网,将…

合唱队形(单调队列 dp)

2.合唱队形 - 蓝桥云课 思路&#xff1a;从左到右找最长单调递增子序列&#xff0c;从右到左找最长单调递增子序列&#xff0c;找它俩和的最大值&#xff0c;和-1就是合唱队形人数最大&#xff0c;人数n-合唱队形人数最大就是我们的答案 #include <bits/stdc.h> using …

Web端实时播放RTSP视频流(监控)

一、安装ffmpeg: 1、官网下载FFmpeg: Download FFmpeg 2、点击Windows图标,选第一个:Windows builds from gyan.dev 3、跳转到下载页面: 4、下载后放到合适的位置,不用安装,解压即可: 5、配置path 复制解压后的\bin路径,配置环境变量如图: <

1.1.1 C语言常用的一些函数(持续更新)

总框架见&#xff08;0. 总框架-CSDN博客&#xff09; &#xff08;1&#xff09;socket (a)分配fd&#xff1b;(b)分配tcp控制块(tcb) int socket(int domain, int type, int protocol);AF_INET IPv4 Internet protocols ip(7)AF_INET6 IP…