合并数组并排序去重
2022-04-08 本文已影响0人
泪滴在琴上
题意就是, 我有两个数组,把他们两个合并。然后并去重,去重的逻辑是哪儿边的重复次数更多,我就留下哪儿边的。
比如下面的数组中,一边有两个数字5,另一半有三个数字5 。则我需要留下三个数字5,去掉两个数字5。 循环往复,最后得到的结果在进行排序。
数组一: [1, 100, 0, 5, 1, 5]
数组二: [2, 5, 5, 5, 1, 3]
最终的结果: [0, 1, 1, 2, 3, 5, 5, 5, 100]
// 判断出现次数最多的次数
function maxNum(item, arr) {
let num = 0;
arr.forEach(val => {
item === val && num++
})
return num
}
function fn(arr1, arr2) {
// 使用Map数据类型来记录次数
let obj = new Map();
// 合并数组并找出最多的次数, 并以键值对存放到Map数据类型
[...arr1, ...arr2].forEach(item => {
let hasNum = obj.get(item)
let num = 1
if (hasNum) {
num = hasNum + 1
}
obj.set(item, num)
})
// 存放合并并去重之后的数组
let arr = []
// 遍历Map数据类型 然后把次数最多的直接push到新数组
for (const key of obj.keys()) {
if (obj.get(key) > 1) {
for (let index = 0; index < Math.max(maxNum(key, arr1), maxNum(key, arr2)); index++) {
arr.push(key)
}
} else {
arr.push(key)
}
}
// 最后进行排序
return arr.sort((a, b) => a - b)
}
这个题的思路其实就是,我先把两个数组合并起来
并以键值对的方式存放到Map数据类型, 键就是数据,而值就是这个数据出现的次数
生成一个新数组,用来存放合并之后的数组
遍历这个Map数据类型, 如果这个数据出现的次数大于一,那么就去寻找两个数组中谁出现的次数更多,把出现次数更多的这个数据,循环push到新数组中。 如果出现次数等于一,那就直接push到新数组中即可。
最后再把数组进行排序,然后返回新数组就可。
作者:Ali2333
链接:https://juejin.cn/post/7079681931662589960
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。