首页 > 其他分享 >LeetCode刷题-哈希表

LeetCode刷题-哈希表

时间:2024-09-07 17:25:43浏览次数:8  
标签:hash func tabel 元素 哈希 print table LeetCode 刷题

一:哈希表

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 存在重复元素

题目:给你一个整数数组 nums 。如果任一值在数组中出现 至少两次 ,返回 true ;如果数组中每个元素互不相同,返回 false

(1)思路:hash表的思路就是;定义一个地点记录数字出现的次数;如果数字在字典中;对应的value加1;如果没有在里面;纳那么就将对应的value赋值为1;然后判断字典中的值是否存大于等于2;如果是说明数组符合条件;不是最优解!

#方法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 使用集合
def func(nums):
    seen = set()  # 使用集合来记录遍历过的数字
    for num in nums:
        if num in seen:
            return True# 如果当前数字已经在集合中,说明有重复,返回 True
        else:
            seen.add(num)  # 否则将当前数字添加到集合中
    return False  # 遍历完整个列表后没有发现重复,返回 False

nums = [1, 5, 2, 3, 4]
result = func(nums)
print(result, end="")  # 输出: True

389 找不同

题目:给定两个字符串 st ,它们只包含小写字母。

字符串 t 由字符串 s 随机重排,然后在随机位置添加一个字母。

请找出在 t 中被添加的字母。

(1)思路:

#方法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]

标签:hash,func,tabel,元素,哈希,print,table,LeetCode,刷题
From: https://www.cnblogs.com/gsupl/p/18401919

相关文章

  • 线性dp:LeetCode516 .最长回文子序列
    LeetCode516.最长回文子序列题目叙述:力扣题目链接(opensnewwindow)给你一个字符串s,找出其中最长的回文子序列,并返回该序列的长度。子序列定义为:不改变剩余字符顺序的情况下,删除某些字符或者不删除任何字符形成的一个序列。示例1:输入:s="bbbab"输出:4解释:一个可能的......
  • 1143. 最长公共子序列(leetcode)
    https://leetcode.cn/problems/longest-common-subsequence/description/经典题,老题回顾classSolution{publicintlongestCommonSubsequence(Stringtext1,Stringtext2){//f[i][j]表示所有在第一个序列前i个数中选择,在第二个序列前j个数中选择得到的最长......
  • LeetCodeTest算法测试 传递一个数组和一个特定的目标整型数字,返回的两个数组元素相加
    1importjava.util.ArrayList;2importjava.util.List;34publicclassLeetCodeTest{5publicstaticvoidmain(String[]args){67int[]intArr=newint[]{2,7,11,15};8List<CustomerIntIndex>customerIntIndexL......
  • 718. 最长重复子数组(leetcode)
    https://leetcode.cn/problems/maximum-length-of-repeated-subarray/难点是在于状态定义,需要考虑到以第i个数为结尾,以第j个数为结尾的最长重复子数组这样的定义而递推就很简单,只需要发生重复时+1即可,和之前的一维的,即最长子数组一样classSolution{publicintfind......
  • 674. 最长连续递增序列(leetcode)
    https://leetcode.cn/problems/longest-continuous-increasing-subsequence/description/classSolution{publicintfindLengthOfLCIS(int[]nums){//f[i]表示以第i个数为结尾的最长连续递增序列//以倒数第2个数划分子集//f[i]=if(nums......
  • 300. 最长递增子序列(leetcode)
    https://leetcode.cn/problems/longest-increasing-subsequence/description/classSolution{publicintlengthOfLIS(int[]nums){//f[i]表示以第i个数为结尾的最长严格上升子序列//以倒数第二个数是多少来划分子集//f[i]=max(f[i-1],f[......
  • 【每日刷题】Day112
    【每日刷题】Day112......
  • 714. 买卖股票的最佳时机含手续费(leetcode)
    https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-with-transaction-fee/classSolution{publicintmaxProfit(int[]prices,intfee){//f[i][j]表示前i天进行交易购买,j=0表示持有股票,j=1表示未持有股票,划分两个状态//f[i][0]=......
  • 洛谷刷题之P1168
    中位数题目描述给定一个长度为NNN的非负整数序列AAA,对于前奇数......
  • 力扣刷题--2643.一最多的行【简单】
    题目描述......