前言: 某位名人说过(bu ke kao zheng ,haha : )遇到问题多总结,并且思考更多 更好的解决方法 。 没错,所以我自己总结了一下,在这里分享给大家.
题目:给定两个数组,编写一个函数来计算它们的交集。
示例 1:
输入:nums1 = [1,2,2,1], nums2 = [2,2]
输出:[2]
Set
利用 Set去除本身的重复,然后合并
let intersection = (arr1,arr2) =>{
let res = []
let a1 = new Set(arr1)
let a2 = new Set(arr2)
a1.forEach(item => {
if(a2.has(item)){
res.push(item)
}
})
return res
}
console.log('intersection : ', intersection(nums1,nums2)); //[2]
filter
用 JavaScript的 filter 数组方法来合并两数组
let intersection = (arr1,arr2) =>{
let a1 = new Set(arr1)
let a2 = new Set(arr2)
return [...a1].filter(item => a2.has(item))
}
console.log('intersection : ', intersection(nums1,nums2)); //[2]
Object 键值对
存储为对象,先存入nums1,然后存入nums2的时候进行判断
let intersection = (arr1,arr2) =>{
let hash = {}
for (let i=0;i<arr1.length;i++){
if(!hash[arr1[i]]){
hash[arr1[i]] = 1
}
}
let res = []
for(let j=0;j<arr2.length;j++){
if(hash[arr2[j]]){
// 对于 arr2 的重复值只 push 一次
delete hash[nums2[j]]
res.push(arr2[j])
}
}
console.log('hash last: ', hash);
return res
}
console.log('intersection : ', intersection(nums1,nums2));
注 : 这种方法对于数字和字符串相同的话会有 bug,比如
let nums1 = [1,2,2,1,'1','2']
let nums2 = [2,2,'2']
// intersection(nums1,nums2) // [2]
我们可以发现,是有问题的,因为 2 和 '2' 是不同的,但是这种方法会判断为同一个值,
这是因为对象的键值只能是字符串,但是我们可以使用 typeof item + item 拼成字符串作为 key 值来避免这个问题,可以参考我的文章 数组去重里的 Object 方法
includes
ES7 Array.prototype.includes 还比较简洁的
let intersection = (arr1,arr2) =>{
// 去除重复元素
a = new Set(arr1)
b = new Set(arr2)
return [...a].filter( v => [...b].includes(v))
}
console.log('intersection : ', intersection(nums1,nums2));
结语
今天的分享就到这里啦,大家也可以思考用对应方法求 差集、并集,也欢迎和我讨论
作者:陈有味
email:chenuvi@outlook.com
码字不易,转载、引用请注明出处