vb 集合key使用_Go 刷 LeetCode 系列:经典(5)设计哈希集合

不使用任何内建的哈希表库设计一个哈希集合

具体地说,你的设计应该包含以下的功能

add(value):向哈希集合中插入一个值。

contains(value) :返回哈希集合中是否存在这个值。

remove(value):将给定值从哈希集合中删除。如果哈希集合中没有这个值,什么也不做。

示例:

MyHashSet hashSet = new MyHashSet();hashSet.add(1);         hashSet.add(2);         hashSet.contains(1);    // 返回 truehashSet.contains(3);    // 返回 false (未找到)hashSet.add(2);          hashSet.contains(2);    // 返回 truehashSet.remove(2);          hashSet.contains(2);    // 返回  false (已经被删除)

注意:

所有的值都在 [0, 1000000]的范围内。

操作的总数目在[1, 10000]范围内。

不要使用内建的哈希集合库。

解题思路:

1,本题考察对hashset 的理解

2,使用拉链法

3,设计简单的hash函数,取模

hashset 和hashmap 区别:

HashSet:

  HashSet实现了Set接口,它不允许集合中出现重复元素。当我们提到HashSet时,第一件事就是在将对象存储在

HashSet之前,要确保重写hashCode()方法和equals()方法,这样才能比较对象的值是否相等,确保集合中没有

HashMap:

  HashMap实现了Map接口,Map接口对键值对进行映射。Map中不允许出现重复的键(Key)。Map接口有两个基本的实现

TreeMap和HashMap。TreeMap保存了对象的排列次序,而HashMap不能。HashMap可以有空的键值对(Key(null)-Value(null))

总结一句话,hash set node节点里存储的是key,hash map node节点存储的是key value pair

代码

type MyHashSet struct {    data []*Node    len int}type Node struct{    key int    next  *Node}/** Initialize your data structure here. */func Constructor() MyHashSet {    return MyHashSet{        data:make([]*Node,10001),        len:10001,    }}func (this *MyHashSet) Add(key int)  {    data:=this.data[key%this.len]    if data==nil{        this.data[key%this.len]=&Node{           key:key,        }    }else{            if data.key==key{                return            }        for data.next!=nil{            data=data.next            if data.key==key{                return            }        }        data.next=&Node{            key:key,        }    }    //this.Print()}func (this *MyHashSet)Print(){   fmt.Println("----",this.len,":")   for i:=0;ithis.       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(":------")}func (this *MyHashSet) 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        }    }}/** Returns true if this set contains the specified element */func (this *MyHashSet) Contains(key int) bool {    data:=this.data[key%this.len]    if data==nil{        return false    }    for data.next!=nil{        if data.key==key{            return true        }        data=data.next    }    return data.key==key}/** * Your MyHashSet object will be instantiated and called as such: * obj := Constructor(); * obj.Add(key); * obj.Remove(key); * param_3 := obj.Contains(key); */

推荐阅读

  • Go 刷 LeetCode 系列:经典(4) 实现跳表


喜欢本文的朋友,欢迎关注“Go语言中文网”:

41e858b1e117c8428337006fda6b3063.png

Go语言中文网启用微信学习交流群,欢迎加微信:274768166,投稿亦欢迎

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值