2024.4.14力扣每日一题——设计哈希集合

2024.4.14

题目来源

力扣每日一题;题序:705

我的题解

方法一 链表数组

由于给定限制次数为10000,所以构造一个长度为10001的链表数组。对于add操作先看数组对应的位置是否为null或者为空,若是则直接加入,否则遍历整个链表看是否有与加入的值相同的元素。对于remove操作,先看数组对应的位置是否为null或者为空,若是则直接退出,否则遍历整个链表看是否有与加入的值相同的元素,若相同则删除对应的链表节点。对于contains操作,先看数组对应的位置是否为null或者为空,若是则直接返回false,否则遍历整个链表看是否有与加入的值相同的元素,若有直接返回true,否则返回false。

对于哈希函数的设计:取key对应的哈希值mod 10000

哈希冲突的解决:使用链地址法解决

java 复制代码
class MyHashSet {
    class LinkedList{
        int val;
        LinkedList next;
        public LinkedList(){}
        public LinkedList(int v){
            val=v;
        }
        public int size(){
            LinkedList root=this;
            int sz=0;
            while(root!=null){
                sz++;
                root=root.next;
            }
            return sz;
        }
    }

    private LinkedList[] keys;
    int n=10001;

    public MyHashSet() {
        keys=new LinkedList[n];
        // Arrays.fill(keys,new LinkedList());
    }

    public void add(int key) {
        int index=myHash(key);
        // 节点为空
        if(keys[index]==null){
            keys[index]=new LinkedList(key);
            // 还未有元素
        }else if(keys[index].size()==0){
            keys[index].val=key;
            //已经有元素
        }else{
            LinkedList root=keys[index];
            if (root.val==key)
                return ;
            while(root.next!=null&&root.next.val!=key){
                root=root.next;
            }
            if(root.next==null)
                root.next=new LinkedList(key);
        }
    }

    public void remove(int key) {
        int index=myHash(key);
        // 节点为空 || 还未有元素
        if(keys[index]==null||keys[index].size()==0)
            return ;
            //已经有元素
        else{
            LinkedList root=keys[index];
            if(root.val==key){
                keys[index]=root.next;
            }else{
                while(root.next!=null&&root.next.val!=key){
                    root=root.next;
                }
                if(root.next!=null)
                    root.next=root.next.next;
            }
        }
    }

    public boolean contains(int key) {
        int index=myHash(key);
        // 节点为空 || 还未有元素
        if(keys[index]==null||keys[index].size()==0)
            return false;
            //已经有元素
        else{
            LinkedList root=keys[index];
            while(root!=null){
                if(root.val==key)
                    return true;
                root=root.next;
            }
            return false;
        }

    }

    public int myHash(int key){
        int iHash=Integer.hashCode(key);
        return iHash%(n-1);
    }

    @Override
    public String toString() {
        return Arrays.toString(keys);
    }
}

有任何问题,欢迎评论区交流,欢迎评论区提供其它解题思路(代码),也可以点个赞支持一下作者哈😄~

相关推荐
菠萝咕噜肉i几秒前
MyBatis是什么?为什么有全自动ORM框架还是MyBatis比较受欢迎?
java·mybatis·框架·半自动
林的快手15 分钟前
209.长度最小的子数组
java·数据结构·数据库·python·算法·leetcode
千天夜24 分钟前
多源多点路径规划:基于启发式动态生成树算法的实现
算法·机器学习·动态规划
从以前29 分钟前
准备考试:解决大学入学考试问题
数据结构·python·算法
向阳12181 小时前
mybatis 缓存
java·缓存·mybatis
.Vcoistnt1 小时前
Codeforces Round 994 (Div. 2)(A-D)
数据结构·c++·算法·贪心算法·动态规划
上等猿1 小时前
函数式编程&Lambda表达式
java
小k_不小1 小时前
C++面试八股文:指针与引用的区别
c++·面试
柒月的猫1 小时前
方格分割(蓝桥杯2017年试题D)
职场和发展·蓝桥杯
蓝染-惣右介1 小时前
【23种设计模式·全精解析 | 行为型模式篇】11种行为型模式的结构概述、案例实现、优缺点、扩展对比、使用场景、源码解析
java·设计模式