字节跳动面试算法题
思路是将两个数组分别分成两个部分,一部分是基础元素,另一部分是数组元素。然后对同类型的元素分别求差集。对于数组元素,要递归判断两个数组元素是否相等,不能使用 == 号,因为数组属于对象, 两等号比较对象的时候是比较它们的地址。
// 判断两个数组是否相等
function arrayEquals(array1, array2) {
let arr1 = array1.slice(0), arr2 = array2.slice(0);
if (arr1.length !== arr2.length) return false;
arr1.sort();
arr2.sort();
for (let i = 0; i < arr1.length; i++) {
if (arr1[i] instanceof Array && arr2[i] instanceof Array)
return arrayEquals(arr1[i], arr2[i]);
else if (!(arr1[i] instanceof Array) && !(arr2[i] instanceof Array)) {
if (arr1[i] !== arr2[i]) return false;
} else return false;
}
return true;
}
// diff算法
function diff(arr1, arr2) {
let arrPlain1 = [], arrRec1 = [];
let arrPlain2 = [], arrRec2 = [];
arr1.forEach(item => {
if (!(item instanceof Array)) arrPlain1.push(item);
else arrRec1.push(item);
})
arr2.forEach(item => {
if (!(item instanceof Array)) arrPlain2.push(item);
else arrRec2.push(item);
})
return [].concat(arrPlain1.concat(arrPlain2).
filter((value, index, self) => {
return self.indexOf(value) === self.lastIndexOf(value);
}))
.concat(arrRec1.filter(item => {
return !arrRec2.some(ar => {
return arrayEquals(item, ar);
})
}))
.concat(arrRec2.filter(item => {
return !arrRec1.some(ar => {
return arrayEquals(item, ar);
})
}))
}