349. 两个数组的交集
给定两个数组 nums1
和 nums2
,返回 它们的交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。
解题思路
这道题就是统计一下每个数组出现的数字种类,我的第一个想法就是采用字典,利用字典中的键来表示每个数字的种类。对两个数组分别统计之后,只需要遍历一下数字的全部种类有哪些同时存在于两个字典中即可。代码如下:
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
给你两个整数数组 nums1
和 nums2
,请你以数组形式返回两数组的交集。返回结果中每个元素出现的次数,应与元素在两个数组中都出现的次数一致(如果出现次数不一致,则考虑取较小值)。可以不考虑输出结果的顺序。
解题思路
这道题就不好再用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():