数组去重
常规
function uniqueArray(arr) {
let newArr = [];
for (let i = 0; i < arr.length; i++) {
if (!newArr.includes(arr[i])) {
newArr.push(arr[i]);
}
}
return newArr;
}
const arr0 = [1, "2", 3, undefined, null, false, null, 1, 2, {}, {}, NaN, NaN];
const arr1 = uniqueArray(arr0);
console.log("arr0", arr0);
console.log("arr1", arr1);
也可以用对象存储标记的方式,类似于下面这种
function uniqueArray(arr) {
const res = new Map();
return arr.filter((a) => !res.has(a) && res.set(a, 1));
}
Set
function uniqueArray(arr) {
return [...new Set(arr)];
}
快慢指针
前提条件是数组有序,空间复杂度为 O(1)
function unique(array) {
// 先对数组进行排序
array = array.sort();
// 如果数组只有0或1项,显然不可能有重复项
// 直接返回原数组
if (array.length < 2) {
return array;
}
// 双指针法原地去重
// 设慢指针指向数组的第一项
let left = 0;
// 快指针指向数组的第二项
let right = 1;
// 循环终止条件:快指针遍历完数组
while (right < array.length) {
if (array[left] === array[right]) {
// 当快指针和慢指针的数据相同时
// 不进行任何操作,快指针向后移动一位
right++;
} else {
// 当快慢指针的数据不同时
// 将慢指针后一位的数据变更为快指针当前位置数据
// 快慢指针同时向后移动一位
array[left + 1] = array[right];
left++;
right++;
}
}
// 去重结束后,left指针刚好指向去重后数组的最后一位
// 使用slice()取0-left正好是去重后的数组
return array.slice(0, left + 1);
}