01 题目
链接:https://leetcode-cn.com/problems/intersection-of-two-arrays-ii
给定两个数组,编写一个函数来计算它们的交集。
示例 1:
输入:nums1 = [1,2,2,1], nums2 = [2,2]
输出:[2,2]
示例 2:
输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出:[4,9]
02 代码&解析(1行解法-Counter)
from collections import Counter
def intersect(nums1,nums2):
# print(Counter(nums1),Counter(nums2))
# print((Counter(nums1) & Counter(nums2)))
# print(*(Counter(nums1) & Counter(nums2))) # 序列+*相当于解压
return [*(Counter(nums1) & Counter(nums2)).elements()]
# 测试数据 1
# nums1 = [1,2,2,1]
# nums2 = [2,2]
# 测试数据 2
nums1 = [4,9,5]
nums2 = [9,4,9,8,4]
print(intersect(nums1,nums2))
输出:
Counter({4: 1, 9: 1, 5: 1}) Counter({9: 2, 4: 2, 8: 1})
Counter({4: 1, 9: 1})
4 9
[4, 9]
解法原链接:https://leetcode-cn.com/problems/intersection-of-two-arrays-ii/solution/1-xing-python-jin-jie-jie-fa-by-qqqun902025048/
1. collection的Counter计数器
python内置函数,快速统计单词在字符串 / 文本中出现的次数
https://blog.csdn.net/eddy_zheng/article/details/47336271
字符串的用法同上
文本单词的统计如下
2. & 取交集
3. 加* 解压
(此图来自 https://www.cnblogs.com/linwenbin/p/10362811.html)
4. elements()
03 代码&解析(hash解法)
利用字典统计nums1和nums2每个元素的数量,然后取得两个字典 相同键的 最小值
,返回结果。
细品~~ 两个字典 相同键的 最小值
from collections import defaultdict
def intersect(nums1, nums2):
dct1 = defaultdict(int) # 字典dct1 存nums1
for i in nums1:
dct1[i] += 1
dct2 = defaultdict(int) # 字典dct2 存nums2
for i in nums2:
dct2[i] += 1
print(dct1,'\n',dct2,'\n',set(dct1)&set(dct2))
dct3 = {i: min(dct1[i], dct2[i]) for i in set(dct1)&set(dct2)}
print(dct3)
return sum([[key]*val for key, val in dct3.items()], [])
# nums1 = [1,2,2,1]
# nums2 = [2,2]
nums1 = [4,9,5]
nums2 = [9,4,9,8,4]
print(intersect(nums1,nums2))
输出
defaultdict(<class 'int'>, {4: 1, 9: 1, 5: 1})
defaultdict(<class 'int'>, {9: 2, 4: 2, 8: 1})
{9, 4}
{9: 1, 4: 1}
[9, 4]
解法原链接:https://leetcode-cn.com/problems/intersection-of-two-arrays-ii/solution/python3-ha-xi-biao-by-ting-ting-28-3/
1. defaultdict与dict实例化字典类型的区别
使用defaultdict任何未定义的key都会默认返回一个根据method_factory参数不同的默认值, 而相同情况下dict()会返回KeyError.
2. dct3 = {i: min(dct1[i], dct2[i]) for i in 交集}
取交集的9,dct1[9]=1,dct2[9]=2,min(dct1[i], dct2[i]) 为1,则dct3中存{9:1}
取交集的4,dct1[4]=1,dct2[4]=2,min(dct1[i], dct2[i]) 为1,则dct3中存{9:1,4: 1}
3. [key]*val for key, val in dct3.items()
val为几,key就出现几次
如 9 1 ==> [9]
如 4 1 ==> [4]
如 7 3 ==> [7,7,7]
4. 汇总在一个[]里 sum([])
一行 [key]*val for key, val in dct3.items() 的结果
[[9], [4]]
sum([[key]*val for key, val in dct3.items()],[]) 的结果
[9, 4]
得加个[ ] ,否则会报错,可能是要将它看成一整个数组才行
In [5]: sum([1,2],[3])
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-5-7b375e43be83> in <module>()
----> 1 sum([1,2],[3])
TypeError: can only concatenate list (not "int") to list
In [6]: sum([[1,2]],[3])
Out[6]: [3, 1, 2]
* 当然不一定用sum,用+号就能把两个数组合并
可以新建个数组存放
list4 = []
for key, val in dct3.items():
# print(key,val,[key]*val)
list4 = list4+[key]*val
In [1]: a = [1,2]
In [2]: d = a+[4,4]
In [3]: d
Out[3]: [1, 2, 4, 4]