FCC面试攻略-算法:找到对等分差

知识提要:对称差 (Symmetric Difference),数学上,两个集合的对称差分是只属于其中一个集合,而不属于另一个集合的元素组成的集合,例如:集合let A = [ 1, 2, 3]和let B = [ 2, 3, 4]的对称差分为A △ B = C = [ 1, 4]。 集合论中的这个运算相当于布尔逻辑中的异或运算。

创建一个函数 sym,输入两个或两个以上的数组作为参数,然后返回值为对称差分的数组

思路:设定两个数组 (例如:let A = [1, 2, 3],let B = [2, 3, 4])作为参数传入,返回对称差分数组(A △ B = C = [1, 4]),且数组中没有重复项。

function sym(...args) {

    //子数组去重
    const newArgs = args.map(item => Array.from(new Set(item)))

    //每次处理两个数组(reduce()),即当前子数组(cur)和上一轮处理结果(prev)
    return newArgs.reduce((prev, cur) => {

        //将当前子数组与上一轮处理结果数组合并(concat())、排序(sort()) 并过滤(filter())
        return prev.concat(cur).sort((a, b) => a - b).filter((item, index, arr) => {

            //提取合并后无重复的值
            return arr[index] !== arr[index + 1] && arr.indexOf(item) === index ? item : ''
        })
    })
}

sym([1, 1, 2, 5], [2, 2, 3, 5], [3, 4, 5, 5])
//return [1, 4, 5]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值