自学内容网 自学内容网

《零基础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


原文地址:https://blog.csdn.net/qq_39728668/article/details/145162467

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!