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

举报
神的孩子在歌唱 发表于 2021/12/22 20:47:07 2021/12/22
【摘要】 前言:作者:神的孩子在歌唱一个算法小菜鸡大家好,我叫智 705. 设计哈希集合难度简单193不使用任何内建的哈希表库设计一个哈希集合(HashSet)。实现 MyHashSet 类:void add(key) 向哈希集合中插入值 key 。bool contains(key) 返回哈希集合中是否存在这个值 key 。void remove(key) 将给定值 key 从哈希集合中删除。如果哈...

前言:

作者:神的孩子在歌唱

一个算法小菜鸡

大家好,我叫智

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

提示:

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

}

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

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

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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