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

devtools/2025/1/16 16:52:34/

《零基础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/devtools/150997.html

相关文章

密码机服务器在云计算中的应用与挑战

随着云计算技术的迅猛发展和普及,密码机服务器作为一种高效、专业的数据安全解决方案,正在云计算领域中扮演着越来越重要的角色。本文将探讨密码机服务器在云计算中的应用及其面临的挑战。 云计算技术涉及大量的数据传输和存储,数据的安全性和…

JavaSwing游戏开发之Camera原理

package org.timer;import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.util.ArrayList; import java.util.List; import java.util.Random;public class GameCameraWithObjects extends JPanel implements KeyListener {// 游戏世界大小private …

NLP学习

第二周 一、深度学习步骤:1. 选定模型结构2. 模型参数随机初始化3. 构造模型损失函数4. 选择优化算法并设置超参数5. 数据准备与预处理6. 训练模型7. 模型评估8. 测试模型9. 应用模型 损失函数极小值、导向意义 超参数的影响迭代次数epoch批次量大小batch size学习率…

【PCIe 总线及设备入门学习专栏 5.3.3 -- PCIe 掩图 mask 介绍】

文章目录 Overview掩图的主要作用PCIe PHY 掩图使用的典型例子 Overview 本文将介绍 PCIe PHY 中掩图 mask的作用。 在 PCIe PHY(物理层)中,掩图(mask) 是用于控制特定位或信号行为的机制,通过屏蔽掉某些位…

Windows图形界面(GUI)-QT-C/C++ - Qt键盘与鼠标事件处理详解

公开视频 -> 链接点击跳转公开课程博客首页 -> ​​​链接点击跳转博客主页 目录 事件处理机制概述 MFC与Qt事件处理对比 MFC事件处理 Qt事件处理 Qt事件传递机制 鼠标事件详解 鼠标事件类型 事件处理函数 ​编辑 鼠标相关信息与反馈 键盘事件详解 键盘事件…

年底了,2025年培训预算怎么整?

培训预算不仅仅是年度计划的一部分,更是企业提升竞争力和适应市场变化的重要工具。年底了,2025年的培训预算是许多HR的重要任务之一。该怎么做明年的培训呢? 培训预算的参考数据 制定培训预算时,企业应参考行业内的平均数据和标杆…

K8S中的Pod生命周期之重启策略

三种策略 Kubernetes 中的 Pod 支持以下三种重启策略: Always: 描述:无论容器退出的原因是什么,都会自动重启容器。 默认值:如果未指定重启策略,Kubernetes 默认使用 Always。 OnFailure: 描…

STL——map

目录 map类 map的构造 map的增删查 map的数据修改 map类 Key就是map底层关键字的类型,T是map底层value的类型,set默认要求Key⽀持 ⼩于⽐较,如果不⽀持或者需要的话可以⾃⾏实现仿函数传给第⼆个模版参数,map底层存储数据的内存…