Leetcode刷题100天—705. 设计哈希集合(集合)—day74

Posted 神的孩子都在歌唱

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Leetcode刷题100天—705. 设计哈希集合(集合)—day74相关的知识,希望对你有一定的参考价值。

前言:

作者:神的孩子在歌唱

一个算法小菜鸡

大家好,我叫智

705. 设计哈希集合

难度简单193

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

实现 MyHashSet 类:

  • void add(key) 向哈希集合中插入值 key
  • bool contains(key) 返回哈希集合中是否存在这个值 key
  • void remove(key) 将给定值 key 从哈希集合中删除。如果哈希集合中没有这个值,什么也不做。

示例:

输入:
["MyHashSet", "add", "add", "contains", "contains", "add", "contains", "remove", "contains"]
[[], [1], [2], [1], [3], [2], [2], [2], [2]]
输出:
[null, null, null, true, false, null, true, null, false]

解释:
MyHashSet myHashSet = new MyHashSet();
myHashSet.add(1);      // set = [1]
myHashSet.add(2);      // set = [1, 2]
myHashSet.contains(1); // 返回 True
myHashSet.contains(3); // 返回 False ,(未找到)
myHashSet.add(2);      // set = [1, 2]
myHashSet.contains(2); // 返回 True
myHashSet.remove(2);   // set = [1]
myHashSet.contains(2); // 返回 False ,(已移除)

提示:

  • 0 <= key <= 106
  • 最多调用 104addremovecontains

**进阶:**你可以不使用内建的哈希集合库解决此问题吗?

链地址法:为每个哈希值维护一个链表,并将具有相同哈希值的元素都放入这一链表当中。

package 集合;

import java.util.Arrays;
import java.util.Iterator;
import java.util.LinkedList;

/**
 * https://leetcode-cn.com/problems/design-hashset/
 * 链地址法
 */
public class _705_设计哈希集合 
    //    定义数组最大值
    private int base = 786;
    //    定义链表数组
    private LinkedList[] data;

    public _705_设计哈希集合() 
        data = new LinkedList[base];
//        循环初始化每个数组的链表
        for (int i = 0; i < base; i++) 
            data[i] = new LinkedList<Integer>();
        
    

    //    增加数据
    public void add(int key) 
        int hash = hash(key);
        if (data(key, hash)) 
            data[hash].offerLast(key);
        
        return;
    

    //    删除数据
    public void remove(int key) 
        int hash = hash(key);
        if (!data(key, hash)) 
            System.out.println(key);
//            注意这里要把key用Interger装起来,俗称装箱
            data[hash].remove((Integer)key);
        
    

    //    判断是否存在数据
    public boolean contains(int key) 
        int hash=hash(key);
        return !data(key,hash);
    

    //    判断函数
    public boolean data(int key, int hash) 

//        定义这个数组位置的迭代器
        Iterator<Integer> iterator = data[hash].iterator();
//        遍历当前链表的值
        while (iterator.hasNext()) 
            int element = iterator.next();
//            集合中不存在相等的数
            if (element == key) 
                return false;
            
        
        return true;
    

    //    获取哈希值
    public int hash(int key) 
        return key % base;
    



本人csdn博客:https://blog.csdn.net/weixin_46654114

转载说明:跟我说明,务必注明来源,附带本人博客连接。

以上是关于Leetcode刷题100天—705. 设计哈希集合(集合)—day74的主要内容,如果未能解决你的问题,请参考以下文章

Leetcode刷题100天—705. 设计哈希集合(集合)—day74

Leetcode刷题100天—706. 设计哈希映射(哈希表)—day74

Leetcode刷题100天—706. 设计哈希映射(哈希表)—day74

Leetcode刷题100天—706. 设计哈希映射(哈希表)—day74

Leetcode刷题100天—217. 存在重复元素(哈希表)—day11

Leetcode刷题100天—169. 多数元素(哈希表)—day10