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

举报
神的孩子在歌唱 发表于 2021/12/23 01:30:05 2021/12/23
【摘要】 前言: 作者:神的孩子在歌唱 一个算法小菜鸡 大家好,我叫智 705. 设计哈希集合 难度简单193 不使用任何内建的哈希表库设计一个哈希集合(HashSet)。 实现 M...

前言:

作者:神的孩子在歌唱

一个算法小菜鸡

大家好,我叫智

image-20211127212718604

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 ,(已移除)

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

提示:

  • 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;
    }

}


  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72

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

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

文章来源: chenyunzhi.blog.csdn.net,作者:神的孩子都在歌唱,版权归原作者所有,如需转载,请联系作者。

原文链接:chenyunzhi.blog.csdn.net/article/details/122094690

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。