前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >golang刷leetcode 经典(6) 实现跳表

golang刷leetcode 经典(6) 实现跳表

作者头像
golangLeetcode
发布2022-08-02 17:32:50
1760
发布2022-08-02 17:32:50
举报
文章被收录于专栏:golang算法架构leetcode技术php

不使用任何内建的哈希表库设计一个哈希映射

具体地说,你的设计应该包含以下的功能

put(key, value):向哈希映射中插入(键,值)的数值对。如果键对应的值已经存在,更新这个值。

get(key):返回给定的键所对应的值,如果映射中不包含这个键,返回-1。

remove(key):如果映射中存在这个键,删除这个数值对。

示例:

代码语言:javascript
复制
MyHashMap hashMap = new MyHashMap();
hashMap.put(1, 1);          
hashMap.put(2, 2);         
hashMap.get(1);            // 返回 1
hashMap.get(3);            // 返回 -1 (未找到)
hashMap.put(2, 1);         // 更新已有的值
hashMap.get(2);            // 返回 1 
hashMap.remove(2);         // 删除键为2的数据
hashMap.get(2);            // 返回 -1 (未找到) 

注意:

所有的值都在 [1, 1000000]的范围内。

操作的总数目在[1, 10000]范围内。

不要使用内建的哈希库。

解题思路

1,使用拉链法

2,和hashset区别是节点里存的内容

A,hashset 里存key

B,hashmap里存key,value

代码语言:javascript
复制
type MyHashMap struct {
    data []*Node
    len int
}

type Node struct{
    key int
    value int
    next  *Node
}

/** Initialize your data structure here. */
func Constructor() MyHashMap {
    return MyHashMap{
        data:make([]*Node,10001),
        len:10001,
    }
}


/** value will always be non-negative. */
func (this *MyHashMap) Put(key int, value int)  {
    data:=this.data[key%this.len]
    if data==nil{
        this.data[key%this.len]=&Node{
           key:key,
           value:value,
        }
    }else{
            if data.key==key{
                data.value=value
                return
            }
        for data.next!=nil{
            data=data.next
            if data.key==key{
                data.value=value
                return
            }
        }
        data.next=&Node{
            key:key,
            value:value,
        }
    }
    //this.Print()
}


/** Returns the value to which the specified key is mapped, or -1 if this map contains no mapping for the key */
func (this *MyHashMap) Get(key int) int {
    data:=this.data[key%this.len]
    if data==nil{
        return -1
    }
    for data.next!=nil{
        if data.key==key{
            return data.value
        }
        data=data.next
    }
    if data.key==key {
         return data.value
    }
    return -1
}


/** Removes the mapping of the specified value key if this map contains a mapping for the key */
func (this *MyHashMap) Remove(key int)  {
    data:=this.data[key%this.len]
    if data==nil{
        return
    }
    if data.key==key{
        this.data[key%this.len]=data.next
        //this.Print()
        return
    }
    for data.next!=nil{
        if data.next.key!=key{
            data=data.next
        }else{
            data.next=data.next.next
        }
    } 
}

func (this *MyHashMap)Print(){
   fmt.Println("----",this.len,":")
   for i:=0;i<len(this.data);i++{
       d:=this.data[i]
       if d!=nil{
           fmt.Println(this.data[i].key)
           for d.next!=nil{
               d=d.next
                fmt.Println(d.key)
           }     
       }
   }
   fmt.Println(":------")
}
/**
 * Your MyHashMap object will be instantiated and called as such:
 * obj := Constructor();
 * obj.Put(key,value);
 * param_2 := obj.Get(key);
 * obj.Remove(key);
 */
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-12-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 golang算法架构leetcode技术php 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档