数据结构-哈希表

一:哈希表

1、有key:value键值对这样的概念;就是字典;通过key得到value

2、hash碰撞问题:就是key的内存地址相同;使用链表的方法解决

3、字典常见操作

#创建哈希表
hash_tabel={}
#添加元素
hash_tabel['name']='admin'
hash_tabel['age']=25
#删除元素
del hash_tabel['name']
#修改元素
hash_tabel['age']=26
#获取元素
print(hash_tabel['age'])
#判断元素是否存在
if 'name' in hash_tabel:
    print('name is in hash_tabel')
else:
    print('name is not in hash_tabel')
#获取hash表的长度
print(len(hash_tabel))
#获取hash表的所有键
print(hash_tabel.keys())
#获取hash表的所有值
print(hash_tabel.values())
#获取hash表的所有键值对
for key,value in hash_tabel.items():
    print(key,value)

二:刷题


217 存在重复元素

(1)方法1思路:使用哈希表统计每个字符串出现的次数;然后判断是否有出现次数大于2的元素;如果有就返回这个元素(value)

(2)方法2:判断列表中的元素是否在新的容器中;如果在的话就说明出现重复的元素;返回True;如果不存在的话返回将当前元素加到新的容器当中;进行下一个元素的判断;知道遍历完列表还没发现出现两次的元素;返回False

#方法1 使用哈希表
def func(nums):
    hash_table = {}
    for i in nums:
        if i in hash_table:
            hash_table[i]+=1
        else:
            hash_table[i]=1
    if 2 in hash_table.values():
        return True
    else:
        return False

nums = [1,2,3]
print(func(nums))
#方法2 使用集合
class Solution:
    def func(self,nums):
        seen=set()
        for i in nums:
            if i in seen:
                return True
            seen.add(i)
        return False

nums=[1, 1, 1, 3, 3, 4, 3, 2, 4, 2]
solution=Solution()
print(solution.func(nums))
#方法3 使用字典
#字典查找元素的时间复杂度为0(n);集合的时间复杂度为o(1);所以推荐使用集合进行查找

389 找不同

(1)思路:

方法1:遍历两个列表;然后判断第二个列表中的哪个元素没有在第一个列表当中;如果有的话就返回这个元素;如果没有返回提示信息

方法2:将字符串拼接;使用哈希表统计出现奇数的元素;然后遍历字典返回value为奇数的key

方法3:其实和前面两个原理大致一致;只是时间复杂度低

#方法1 遍历
def func(s,t):
    list=[]
    for i in t:
        if i not in s:
            list.append(i)
    for i in list:
        print(i,end="")
    return ""
s=""
t="abcde"
print(func(s,t))
#方法2 将字符串拼接;输出奇数元素def func(s,t):
    num=s+t
    hash_table={}
    for i in num:
        if i in hash_table:
            hash_table[i]+=1
        else:
            hash_table[i]=1
    for key,value in hash_table.items():
        if value==1:
            return key
    return None
s='abcde'
t='abcdef'
print(func(s,t))
#方法3:使用hash表实现
def func(s,t):
    hash_table = {}
    for i in s:
        hash_table[i] = 1
    for i in t:
        if i not in hash_table:
            return i
    return "No different character found"
s = "abcd"
t = "abcd"
print(func(s,t))

496 下一个更大的元素

题目:nums1 中数字 x下一个更大元素 是指 xnums2 中对应位置 右侧第一个x 大的元素。

给你两个 没有重复元素 的数组 nums1nums2 ,下标从 0 开始计数,其中nums1nums2 的子集。

对于每个 0 <= i < nums1.length ,找出满足 nums1[i] == nums2[j] 的下标 j ,并且在 nums2 确定 nums2[j]下一个更大元素 。如果不存在下一个更大元素,那么本次查询的答案是 -1

返回一个长度为 nums1.length 的数组 ans 作为答案,满足 ans[i] 是如上所述的 下一个更大元素

def func(nums1, nums2):
    # 创建哈希表存储 nums2 中每个元素的下一个更大元素
    next_greater = {}
    stack = []
    # 倒序遍历 nums2,构建哈希表
    for num in reversed(nums2):
        # 保持栈中的元素按从小到大的顺序排列
        while stack and stack[-1] <= num:
            stack.pop()
        # 如果栈不为空,栈顶元素就是 num 的下一个更大元素
        if stack:
            next_greater[num] = stack[-1]
        else:
            next_greater[num] = -1

        stack.append(num)
    # 根据 nums1 构建结果数组
    result = []
    for num in nums1:
        result.append(next_greater[num])
    return result
# 测试
nums1 = [2, 4]
nums2 = [1, 2, 3, 4]
print(func(nums1, nums2))  # 输出: [3, -1]
posted @ 2024-09-08 20:24  Gsupl.落浅~  阅读(7)  评论(0编辑  收藏  举报