[Python-哈希表]两数组交集、快乐数

349. 两个数组的交集

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

解题思路

这道题就是统计一下每个数组出现的数字种类,我的第一个想法就是采用字典,利用字典中的键来表示每个数字的种类。对两个数组分别统计之后,只需要遍历一下数字的全部种类有哪些同时存在于两个字典中即可。代码如下:

class Solution:
    def intersection(self, nums1: List[int], nums2: List[int]) -> List[int]:
        dic1 = {}
        dic2 = {}
        ans = []
        for num in nums1:
            dic1[num]=[1]
        for num in nums2:
            dic2[num]=[1]
        for i in range(0,1001): #这里其实是限制了数值的大小的,也可以用数组来映射哈希表,但是太大了。
            if i in dic1 and i in dic2:
                ans.append(i)
        return ans

大佬们总能给我拓宽眼界,这道题有一个更加简单的方法,就是利用set函数,set函数是一种集合类型,用于存储无序且不重复的元素。

例如:

nums2 = [9,4,9,8,4]

#在使用set函数后
set2 = set(nums2)

#输出为
{8,9,4}

因此代码可写为如下:

class Solution:
    def intersection(self, nums1: List[int], nums2: List[int]) -> List[int]:
        set1 = set(nums1)
        set2 = set(nums2)
        return list(set1 & set2)
 

tips:set函数是构造集合,不是列表,因此该题中集合取交集后仍是集合,需要使用list转换为列表形式。

350. 两个数组的交集 II

给你两个整数数组 nums1nums2 ,请你以数组形式返回两数组的交集。返回结果中每个元素出现的次数,应与元素在两个数组中都出现的次数一致(如果出现次数不一致,则考虑取较小值)。可以不考虑输出结果的顺序。

解题思路

这道题就不好再用set函数了,因为要知道元素出现的次数,因此本题采用字典法。

class Solution:
    def intersect(self, nums1: List[int], nums2: List[int]) -> List[int]:
        dic1 = {}
        dic2 = {}
        ans = []
        for num in nums1:
            dic1[num] = dic1.get(num,0)+1
        for num in nums2:
            dic2[num] = dic2.get(num,0)+1
        for i in range(1001):
            if i in dic1 and i in dic2:
                cnt = min(dic1[i],dic2[i])
                for j in range(cnt):
                    ans.append(i)
        return ans

tips:这里使用了字典的get函数,是指获取字典中对应键的值,如果不存在该键,则返回0并新建这个键在字典中。

202. 快乐数

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

「快乐数」 定义为:

  • 对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。

  • 然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。

  • 如果这个过程 结果为 1,那么这个数就是快乐数。

如果 n快乐数 就返回 true ;不是,则返回 false

解题思路

注意题目中的定义,判断是否为快乐数的过程只有两种情况,一是该数变为1,二是无限循环。无限循环的意思就是会出现相同的数字,这就转化为了哈希表了。具体思路为,对于每个数,先转换为字符串的形式以便对每个数字求其平方和,然后继续循环直到变为1,或者出现相同的数字。

出现相同数字的判断依据是什么呢?可以利用字典来存储已经出现过的数字,即,如果数字不在字典中,则存储为键值,若存在于字典中,则退出循环。代码如下:

class Solution:
    def isHappy(self, n: int) -> bool:
        str_n = str(n)
        l_n = len(str_n)
        sum_n = 0
        dic = {}
        while sum_n != 1:
            sum_n = 0
            for i in range(l_n):
                sum_n += int(str_n[i])*int(str_n[i])
            if sum_n not in dic:
                dic[sum_n] = [1]
            else:
                return False
            str_n = str(sum_n)
            l_n = len(str_n)
        return True

tips:if sum_n not in dic:这段代码本身就是用来查看字典中是否存在某个键的。如果查找值的话则为if 2 in my_dict.values():

  • 10
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值