不使用任何内建的哈希表库设计一个哈希映射
具体地说,你的设计应该包含以下的功能
put(key, value):向哈希映射中插入(键,值)的数值对。如果键对应的值已经存在,更新这个值。
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 (未找到)
注意:
所有的值都在 [1, 1000000]的范围内。
操作的总数目在[1, 10000]范围内。
不要使用内建的哈希库。
解题思路:
1,使用拉链法
2,和hashset区别是节点里存的内容
A,hashset 里存key
B,hashmap里存key,value
type MyHashMap struct {
data []*Node
len int
}
type Node struct{
key int
value int
next *Node
}
/** Initialize your data structure here. */
func Constructor() MyHashMap {
return MyHashMap{
data:make([]*Node,10001),
len:10001,
}
}
/** value will always be non-negative. */
func (this *MyHashMap) Put(key int, value int) {
data:=this.data[key%this.len]
if data==nil{
this.data[key%this.len]=&Node{
key:key,
value:value,
}
}else{
if data.key==key{
data.value=value
return
}
for data.next!=nil{
data=data.next
if data.key==key{
data.value=value
return
}
}
data.next=&Node{
key:key,
value:value,
}
}
//this.Print()
}
/** Returns the value to which the specified key is mapped, or -1 if this map contains no mapping for the key */
func (this *MyHashMap) Get(key int) int {
data:=this.data[key%this.len]
if data==nil{
return -1
}
for data.next!=nil{
if data.key==key{
return data.value
}
data=data.next
}
if data.key==key {
return data.value
}
return -1
}
/** Removes the mapping of the specified value key if this map contains a mapping for the key */
func (this *MyHashMap) Remove(key int) {
data:=this.data[key%this.len]
if data==nil{
return
}
if data.key==key{
this.data[key%this.len]=data.next
//this.Print()
return
}
for data.next!=nil{
if data.next.key!=key{
data=data.next
}else{
data.next=data.next.next
}
}
}
func (this *MyHashMap)Print(){
fmt.Println("----",this.len,":")
for i:=0;i<len(this.data);i++{
d:=this.data[i]
if d!=nil{
fmt.Println(this.data[i].key)
for d.next!=nil{
d=d.next
fmt.Println(d.key)
}
}
}
fmt.Println(":------")
}
/**
* Your MyHashMap object will be instantiated and called as such:
* obj := Constructor();
* obj.Put(key,value);
* param_2 := obj.Get(key);
* obj.Remove(key);
*/
本文分享自 golang算法架构leetcode技术php 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!