JS 二维数组去重

华为OD面试中面试官出了一道编程题:全排列Ⅱ。自己的想法就是先把所有的排列插入一个数组,再对二维数组进行去重。但是在使用 arr.indexOf() 和 set 去重时并没有成功
1、遍历数组,使用indexOf() 方法判断 返回数组 res 中是否包含当前元素;

var arr = [[1, 1, 2], [1, 2, 1], [1, 1, 2]]
var res = []
for (var i = 0; i < arr.length; i++) {
	if (res.indexOf(i) == -1) {
		res.add(arr[i])
	}
}
console.log(res)

输出结果:

zhangmeng@zhangmengdeMacBook-Pro test % node practice.js
[ [ 1, 1, 2 ], [ 1, 2, 1 ], [ 1, 1, 2 ] ]

2、使用 set 对返回数组去重;

var arr = [[1, 1, 2], [1, 2, 1], [1, 1, 2], [1, 2, 2]]
console.log([...new Set(arr)])
输出结果:

```bash
zhangmeng@zhangmengdeMacBook-Pro test % node practice.js
[ [ 1, 1, 2 ], [ 1, 2, 1 ], [ 1, 1, 2 ], [ 1, 2, 2 ] ]

上面两种方法都没有对二维数组去重,原因是indexOf 防范和 set 去重都是使用的元素的引用而不是值
3、使用对象的key不能重复原则,对数组进行去重

var arr = [[1, 1, 2], [1, 2, 1], [1, 1, 2], [1, 2, 3]]
var obj = {}
arr.forEach(item => {
  obj[item] = item
})
console.log(Object.values(obj)) 

输出结果:

zhangmeng@zhangmengdeMacBook-Pro test % node practice.js
[ [ 1, 1, 2 ], [ 1, 2, 1 ], [ 1, 2, 3 ] ]

4、全排列Ⅱ最终的答案:

var permuteUnique = function(nums) {
    var obj = {}
    var dfs = function(arr1, arr2) {
        if (!arr2.length) {
            obj[arr1] = arr1
        }
        for (var i = 0; i < arr2.length; i++) {
            var tmp1 = Object.assign([], arr1)
            var tmp2 = Object.assign([], arr2)
            tmp1.push(tmp2[i])
            tmp2.splice(i, 1)
            dfs(tmp1, tmp2)
        }
    }
    dfs([], nums)
    
    return Object.values(obj)
};
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值