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

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

相关推荐
无聊的小坏坏6 分钟前
【数据结构】二叉搜索树
数据结构
山北雨夜漫步11 分钟前
机器学习 Day18 Support Vector Machine ——最优美的机器学习算法
人工智能·算法·机器学习
Lizhihao_19 分钟前
Spring MVC 接口的访问方法如何设置
java·后端·spring·mvc
拼好饭和她皆失23 分钟前
算法加训之最短路 上(dijkstra算法)
算法
_龙小鱼_39 分钟前
Kotlin 作用域函数(let、run、with、apply、also)对比
java·前端·kotlin
小伍_Five44 分钟前
spark数据处理练习题详解【上】
java·开发语言·spark·scala
Mcband1 小时前
EasyExcel动态表头
java·windows
曼岛_1 小时前
[Java实战]Spring Boot整合RabbitMQ:实现异步通信与消息确认机制(二十七)
java·spring boot·java-rabbitmq
程序猿七度1 小时前
【Arthas实战】使用场景与常用命令
java·jvm·arthas
陳長生.2 小时前
JAVA EE(进阶)_进阶的开端
java·java-ee