LeetCode刷题记:哈希表

92 阅读3分钟

作者: 千石
支持:点赞、收藏、评论
欢迎各位在评论区交流

前言

本文内容来自我平时学习的一些积累,如有错误,还请指正

在题目实战部分,我将代码实现和代码解释设置在了解题思路的下方,方便各位作为参考刷题

一些话

本文内容来自我平时学习的一些积累,如有错误,还请指正

在题目实战部分,我将代码实现和代码解释设置在了解题思路的下方,方便各位作为参考刷题

题目练习步骤:

  1. 给自己10分钟,读题并思考解题思路
  2. 有了思路以后开始写代码,如果在上一步骤中没有思路则停止思考并且看该题题解
  3. 在看懂题解(暂时没看懂也没关系)的思路后,背诵默写题解,直至能熟练写出来
  4. 隔一段时间,再次尝试写这道题目

刷题

242. 有效的字母异位词 - 力扣(LeetCode)

image.png

题解

题目要求判断两个字符串是否为字母异位词,即两个字符串中的每个字符出现的次数都相同。

我们可以使用一个长度为26的数组来计数每个字母出现的次数,因为题目中已经说明了字符串只包含小写字母。我们首先遍历第一个字符串s,并对每个字符在计数数组中对应的位置加1,然后遍历第二个字符串t,并对每个字符在计数数组中对应的位置减1。如果两个字符串中的字母都一样,则计数数组应该全为0。

最后,我们再次遍历计数数组,如果有任何一个计数器不为0,则两个字符串不是字母异位词。如果计数数组中的所有计数器都为0,则两个字符串是字母异位词。

代码如下:

def isAnagram(s, t):
    if len(s) != len(t):
        return False
    # 创建一个长度为26的数组来计数每个字母出现的次数
    count = [0] * 26
    for i in range(len(s)):
        count[ord(s[i]) - ord('a')] += 1
        count[ord(t[i]) - ord('a')] -= 1
    # 如果两个字符串中的字母都一样,则计数数组应该全为0
    for c in count:
        if c != 0:
            return False
    return True

349. 两个数组的交集 - 力扣(LeetCode)

image.png

题目要求求解两个数组的交集,即两个数组中都存在的元素的集合。我们可以使用Python内置的set数据结构来解决这个问题。

我们将其中一个数组转换成set,并遍历另一个数组。如果当前元素在set中出现过,则将其添加到结果集合中。因为交集中的元素不能重复,所以我们使用set来存储结果集合。最后将结果集合转化为列表并返回即可。

代码如下:

def intersection(nums1, nums2):
    set1 = set(nums1)
    result = set()
    for num in nums2:
        if num in set1:
            result.add(num)
    return list(result)

202. 快乐数 - 力扣(LeetCode)

image.png

题解

这道题目可以使用哈希表来判断一个数是否重复出现。具体思路如下:

  1. 初始化一个空集合 seen,用于存储每次计算出来的数字。
  2. 进入循环,计算当前数的每个数字的平方和。
  3. 判断计算出来的结果是否等于 1,如果等于 1,则说明该数是快乐数,返回 True;否则执行下一步。
  4. 判断计算出来的结果是否已经在集合 seen 中出现过,如果是,则说明进入了循环,返回 False;否则将计算出来的结果加入集合 seen 中。
  5. 不断重复步骤 2-4,直到返回 True 或者 False。

代码如下:

class Solution:
    def isHappy(self, n: int) -> bool:
        seen = set()
        while n not in seen:
            seen.add(n)
            n = sum(int(i)**2 for i in str(n))
        return n == 1