Gsupl.落浅~zbxGsupl.落浅~

01:56:05 AM

哥伦布

13°

数据结构-哈希表

Gsupl.落浅·2024-09-08 20:24·24 次阅读

数据结构-哈希表

一:哈希表

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

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

3、字典常见操作

Copy
#创建哈希表 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

Copy
#方法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:其实和前面两个原理大致一致;只是时间复杂度低

Copy
#方法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] 是如上所述的 下一个更大元素

Copy
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 @   Gsupl.落浅~  阅读(24)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
点击右上角即可分享
微信分享提示

目录导航

一:哈希表
二:刷题