当前位置: 首页 > article >正文

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

《零基础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.kler.cn/a/505837.html

相关文章:

  • 基于光偏振与光学调制实现白光干涉相移
  • [微服务]redis数据结构
  • 【day5】Redis持久化之AOF + Redis事务_锁机制
  • linux自动分区后devmappercentos-home删除后合并到其它分区上
  • js:根据后端返回数据的最大值进行计算然后设置这个最大值为百分之百,其他的值除这个最大值
  • fast-crud select下拉框 实现多选功能及下拉框数据动态获取(通过接口获取)
  • 数据分析思维(十一):应用篇——用数据分析解决问题
  • 《OpenCV》——模版匹配
  • java.net.SocketException: Connection reset 异常原因分析和解决方法
  • 数据库第四天作业
  • Unity3D仿星露谷物语开发21之添加更多道具
  • 【机器学习】数据拟合-最小二乘法(Least Squares Method)
  • 苹果手机ios脚本用按键精灵文件配置代码
  • SpringBoot:使用HTTP2+protobuf实现高性能微服务调用(一)服务器端实现
  • Checkbox 多选框的使用
  • 微信小程序原生与 H5 交互方式
  • Django Admin 自定义操作封装
  • ssh,samba,tftp,nfs服务安装和配置
  • 【Java计算机毕业设计】基于SSM旅游景区网络购票系统【源代码+数据库+LW文档+开题报告+答辩稿+部署教程+代码讲解】
  • 19. 删除链表的倒数第 N 个结点【力扣】
  • 从零开始深度学习:(1)张量的常用操作
  • 从0开始学习搭网站第三天
  • 【k8s】用户和服务账户联系(user、serviceaccount、sa)
  • C++ inline的使用和含义详解
  • JavaScript系列(28)--模块化开发详解
  • ansible之playbook实战