给定两个数组,编写一个函数来计算它们的交集。
示例 1:
输入:nums1 = [1,2,2,1], nums2 = [2,2]
输出:[2,2]
示例 2:
输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出:[4,9]
解题思路:
- 先对数组进行排序,然后使用两个指针,分别指向两个数组的开始位置
- 如果两个指针指向的值相同,说明这个值是他们的交集,就把这个值加入到集合list中,然后两个指针在分别往后移一步。
- 如果两个指针指向的值不同,那么指向的值相对小的往后移一步,相对大的先不动,然后再比较。
- 重复2、3步骤,直到其中一个指针不能再移动为止,最后返回list
请看代码
// 两个一维数字数组求交集
export const getMixed = (arr1, arr2) => {
arr1.sort((a, b) => { return a - b })
arr2.sort((a, b) => { return a - b })
let i = 0
let j = 0
let list = [] // 存放相同数组元素
// 当其中一个数组遍历结束就跳出循环
while (i < arr1.length && j < arr2.length) {
if (arr1[i] < arr2[j]) {
// 如果i指向的值小于j指向的值,说明i指向的值小了,i往后移一步
i++
} else if (arr1[i] > arr2[j]) {
// 如果i指向的值大于j指向的值,说明j指向的值小了,j往后移一步
j++
} else {
// 如果i指向的值等于j指向的值, 说明这两个值是重复的元素,存入list中,i和j同时后移
list.push(arr1[i])
i++
j++
}
}
return [...list]
}
// 也可以使用map解决,创建json, key: value, key表示数组元素,value表示出现的次数