欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Go語(yǔ)言題解LeetCode705設(shè)計(jì)哈希集合

 更新時(shí)間:2022年12月28日 15:29:17   作者:劉09k11  
這篇文章主要為大家介紹了Go語(yǔ)言題解LeetCode705設(shè)計(jì)哈希集合,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

題目描述

705. 設(shè)計(jì)哈希集合

不使用任何內(nèi)建的哈希表庫(kù)設(shè)計(jì)一個(gè)哈希集合(HashSet)。

實(shí)現(xiàn) MyHashSet 類:

  • void add(key) 向哈希集合中插入值 key 。
  • bool contains(key) 返回哈希集合中是否存在這個(gè)值 key 。
  • void remove(key) 將給定值 key 從哈希集合中刪除。如果哈希集合中沒有這個(gè)值,什么也不做。   示例:
輸入:
["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 <= 10^6
  • 最多調(diào)用 10^4 次 add、remove 和 contains

思路分析

實(shí)現(xiàn)使用了鏈地址法,解決哈希沖突方法使用了模取余的方法(較簡(jiǎn)單的)。

這里說下為什么大家說模最好取質(zhì)數(shù),我的理解是取質(zhì)數(shù)可以讓取余后的結(jié)果更加均勻,以減少?zèng)_突。

舉個(gè)例子,假如我們?nèi)?為模,那么雖然理論上我們應(yīng)該會(huì)讓數(shù)字均勻落入4個(gè)桶中,但是對(duì)于下邊這個(gè)數(shù)組:

1,3,5,7,9

所有數(shù)字都落入了1,3兩個(gè)桶中,造成了極大的不均,導(dǎo)致哈希沖突發(fā)生頻繁。對(duì)于一個(gè)合數(shù),只要我們構(gòu)造合數(shù)倍數(shù)相關(guān)的數(shù)組,就很容易使哈希沖突變多,所以盡量選用質(zhì)數(shù)。

AC 代碼

struct Listnode{
    int val;
    Listnode* next = nullptr;
    Listnode()=default;
    Listnode(int val){
        this->val = val;
    }
};
class MyHashSet {
public:
    /** Initialize your data structure here. */
    const int prime = 991;
    vector<Listnode*> nodes;
    MyHashSet(): nodes(prime, nullptr){
    }
    void add(int key) {
        if(nodes[key%prime] == nullptr){
            nodes[key%prime] = new Listnode(key);
        }else{
            Listnode* node = nodes[key%prime];
            while(node != nullptr){
                if(node->val == key)return;
                node = node->next;
            }
            node = new Listnode(key);
            node->next = nodes[key%prime];
            nodes[key%prime] = node;
        }
    }
    void remove(int key) {
        Listnode* prenode = nodes[key%prime];
        if(prenode != nullptr && prenode->val == key){
            if(prenode->next != nullptr){
                nodes[key%prime] = prenode->next;
                delete prenode;
            }else{
                delete prenode;
                nodes[key%prime] = nullptr;
            }
            return;
        }
        while(prenode != nullptr && prenode->next != nullptr){
            if(prenode->next->val == key){
                Listnode* temp = prenode->next;
                prenode->next = prenode->next->next;
                delete temp;
                return;
            }
            prenode = prenode->next;
        }
    }
    /** Returns true if this set contains the specif ied element */
    bool contains(int key) {
        Listnode* node = nodes[key%prime];
        while(node != nullptr){
            if(node->val == key)return true;
            node = node->next;
        }
        return false;
    }
};
/**
 * Your MyHashSet object will be instantiated and called as such:
 * MyHashSet* obj = new MyHashSet();
 * obj->add(key);
 * obj->remove(key);
 * bool param_3 = obj->contains(key);
 */

以上就是Go語(yǔ)言題解LeetCode705設(shè)計(jì)哈希集合的詳細(xì)內(nèi)容,更多關(guān)于Go語(yǔ)言設(shè)計(jì)哈希集合的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 詳解golang碎片整理之 fmt.Scan

    詳解golang碎片整理之 fmt.Scan

    本文介紹了從golang語(yǔ)言中fmt包從標(biāo)準(zhǔn)輸入獲取數(shù)據(jù)的Scan系列函數(shù)、從io.Reader中獲取數(shù)據(jù)的Fscan系列函數(shù)以及從字符串中獲取數(shù)據(jù)的Sscan系列函數(shù)的用法,感興趣的小伙伴們可以參考一下
    2019-05-05
  • Golang 實(shí)現(xiàn)Socket服務(wù)端和客戶端使用TCP協(xié)議通訊

    Golang 實(shí)現(xiàn)Socket服務(wù)端和客戶端使用TCP協(xié)議通訊

    這篇文章主要介紹了Golang 實(shí)現(xiàn)Socket服務(wù)端和客戶端使用TCP協(xié)議通訊,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧
    2020-12-12
  • go語(yǔ)言中的return語(yǔ)句

    go語(yǔ)言中的return語(yǔ)句

    這篇文章主要介紹了go語(yǔ)言中的return語(yǔ)句,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下,希望對(duì)你的學(xué)習(xí)有所幫助
    2022-05-05
  • golang高并發(fā)系統(tǒng)限流策略漏桶和令牌桶算法源碼剖析

    golang高并發(fā)系統(tǒng)限流策略漏桶和令牌桶算法源碼剖析

    這篇文章主要介紹了golang高并發(fā)系統(tǒng)限流策略漏桶和令牌桶算法源碼剖析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • go語(yǔ)言的panic和recover函數(shù)用法實(shí)例

    go語(yǔ)言的panic和recover函數(shù)用法實(shí)例

    今天小編就為大家分享一篇關(guān)于go語(yǔ)言的panic和recover函數(shù)用法實(shí)例,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2019-04-04
  • Go語(yǔ)言中Struct與繼承與匿名字段和內(nèi)嵌結(jié)構(gòu)體全面詳解

    Go語(yǔ)言中Struct與繼承與匿名字段和內(nèi)嵌結(jié)構(gòu)體全面詳解

    這篇文章主要介紹了Go語(yǔ)言中Struct與繼承與匿名字段和內(nèi)嵌結(jié)構(gòu)體,Go語(yǔ)言中通過結(jié)構(gòu)體的內(nèi)嵌再配合接口比面向?qū)ο缶哂懈叩臄U(kuò)展性和靈活性,感興趣的可以了解一下
    2023-04-04
  • Gin的中間件執(zhí)行流程與用法詳解

    Gin的中間件執(zhí)行流程與用法詳解

    我們?cè)谑褂肎in框架進(jìn)行Web開發(fā)的時(shí)候,基本上都會(huì)遇到登錄攔截的場(chǎng)景,在Gin當(dāng)中,?中間件和業(yè)務(wù)處理函數(shù)都是一樣的類型,都是一種函數(shù),本文給大家介紹了Gin的中間件執(zhí)行流程與用法,需要的朋友可以參考下
    2024-04-04
  • 如何使用Goland IDE go mod 方式構(gòu)建項(xiàng)目

    如何使用Goland IDE go mod 方式構(gòu)建項(xiàng)目

    這篇文章主要介紹了如何使用Goland IDE go mod 方式構(gòu)建項(xiàng)目,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-10-10
  • Goland使用delve進(jìn)行遠(yuǎn)程調(diào)試的詳細(xì)教程

    Goland使用delve進(jìn)行遠(yuǎn)程調(diào)試的詳細(xì)教程

    網(wǎng)上給出的使用delve進(jìn)行遠(yuǎn)程調(diào)試,都需要先在本地交叉編譯或者在遠(yuǎn)程主機(jī)上編譯出可運(yùn)行的程序,然后再用delve在遠(yuǎn)程啟動(dòng)程序,本教程會(huì)將上面的步驟簡(jiǎn)化為只需要兩步,1,在遠(yuǎn)程運(yùn)行程序2,在本地啟動(dòng)調(diào)試,需要的朋友可以參考下
    2024-08-08
  • 線上golang grpc服務(wù)資源泄露問題排查

    線上golang grpc服務(wù)資源泄露問題排查

    這篇文章主要介紹了線上golang grpc服務(wù)資源泄露問題排查,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-12-12

最新評(píng)論