华为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)
};