数组去重
const arr = [1, 1, 2, 3, 4, 5, 6];
// 方法一: Set
const unique = (arr) => {
return [...new Set(arr)]; // 或者Array.from(new Set(arr))
};
// 方法二:用filter 空间复杂度O(1)
const unique = (arr) => {
return arr.filter((item, index) => arr.indexOf(item) == index);
};
// 方法三:对于有序数组,相邻两项对比法, 空间复杂度O(1)
// splice 改变了原数组,遍历的时候数组长度会改变,所以当删除一个元素后要记得i--
const unique = (arr) => {
if (arr.length < 2) return arr;
for (let i = 0; i < arr.length; i++) {
if (arr[i] == arr[i + 1]) {
arr.splice(i, 1);
i--;
}
}
return arr;
};
// 其他方法,定义一个新数组用来存放去重后元素,空间复杂度O(n);
const unique = (arr) => {
let newArr = [];
for (let i = 0; i < arr.length; i++) {
if (!newArr.includes(arr[i])) {
// 或者newArr.indexOf(arr[i]) == -1
newArr.push(arr[i]);
}
}
return newArr;
};
unique(arr);
两个有序数组如何合并成一个有序数组
function arrSort(arr1, arr2) {
var [i,j] = [0,0];
let newArr = [];
while(i < arr1.length || j <arr2.length) {
if (arr1[i] < arr2[j]) {
newArr.push(arr1[i]);
i++
} else if (arr1[i] > arr2[j]) {
newArr.push(arr2[j])
j++
} else {
if(arr1[i]) newArr.push(arr1[i]);
if(arr2[j]) newArr.push(arr2[j]);
i++;
j++
}
}
return newArr
}
let arrs = arrSort([2,4,6,7], [1,2,3,5,8,9,10,33,44,49]);
console.log(arrs);
给定两个数组,编写一个函数来计算它们的交集
输入: nums1 = [1,2,2,1], nums2 = [2,2]
输出: [2]
function(nums1, nums2) {
return [...new Set(nums1.filter((item)=>nums2.includes(item)))]
};
function(nums1, nums2) {
let map1 = new Set(nums1);
let map2 = new Set(nums2);
let res = []
map1.forEach((item) => {
if(map2.has(item)){
res.push(item)
}
})
return res
};
function(nums1, nums2) {
const map = {}, ans = [];
nums1.forEach(element => {
map[element] = true;
});
nums2.forEach(element => {
if (map[element]) {
ans.push(element);
}
});
return ans;
}
手写一个方法,一个很深的对象,逐次取出每一层级的key转化为arr
求最长公共前缀
输入: ["flower","flow","flight"] 输出: "fl"
对象数组按对象的某个属性给数组排序
const compare = property => {
return (a,b) => {
const value1 = a[property];
const value2 = b[property];
return value1 - value2; // 升序
};
};
arr.sort(compare('age'))