代码随想录算法训练营第五天 | 哈希表基础、有效字母异位、两个数组交集、快乐数

哈希表基础理论
https://programmercarl.com/哈希表理论基础.html#哈希表
242有效字母异位词题
https://leetcode.cn/problems/valid-anagram/description/
242代码随想录解析
https://programmercarl.com/0242.有效的字母异位词.html#算法公开课
349两个数组的交集https://leetcode.cn/problems/intersection-of-two-arrays/
349代码随想录解析
https://programmercarl.com/0349.两个数组的交集.html#算法公开课
202快乐数
https://leetcode.cn/problems/happy-number/
202代码随想录解析
https://programmercarl.com/0202.快乐数.html#其他语言版本

哈希表基础理论

当我们遇到了要快速判断一个元素是否出现集合里的时候,就要考虑哈希法

python中重要和字典相关的语句

num = res.get(num,0)+1
##res.get(num,0) 如果存在num,则获取该数值,如果不存在该key,则赋值为0

242有效字母异位词

题目

给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。

注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。

题解

对于Python来说 有两种解决方案

  1. 直接采用python的collections.counter
  2. 采用哈希表 统计26字母的频次

解法代码

###解法一:counter
class Solution:
    def isAnagram(self, s: str, t: str) -> bool:
        s_dict = dict(collections.Counter(s))
        t_dict = dict(collections.Counter(t))
        if s_dict==t_dict:
            return True
        else:
            return False
##解法二
class Solution:
    def isAnagram(self, s: str, t: str) -> bool:
        record = [0]*26 ##哈希表
        for i in s:
            record[ord(i)-ord("a")]+=1
        for i in t:
            record[ord(i)-ord("a")]-=1
        for i in record:
            if i!=0:
                return False
        return True

349两个数组的交集

题目

给定两个数组 nums1 和 nums2 ,返回 它们的 交集。
输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。

题解:

  1. 采用字典和集合统计
  2. 直接使用集合
##用集合方法
class Solution:
    def intersection(self, nums1: List[int], nums2: List[int]) -> List[int]:
        return list(set(nums1) & set(nums2))

快乐数

题目

编写一个算法来判断一个数 n 是不是快乐数。

「快乐数」 定义为:

对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。
然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。
如果这个过程 结果为 1,那么这个数就是快乐数。
如果 n 是 快乐数 就返回 true ;不是,则返回 false。

题解

要点在如果不是快乐数,可能无限循环始终变不到1
因此,只需要判断结果是否有重复出现即可

解题代码

class Solution:
    def isHappy(self, n: int) -> bool:
        curr = n
        res = {}
        while curr!=1 and res.get(curr,0)<2:
            num = 0
            for i in str(curr):
                num = num + int(i)**2
            curr = num
            res[num] = res.get(num,0)+1
        if curr==1:
            return True
        else:
            return False
posted @ 2024-06-05 15:35  哆啦**  阅读(1)  评论(0编辑  收藏  举报