4.3-算法题
第一题
设计一个 uniqueify 函数,可以根据用户自定义的 重复判定规则 进行数组元素去重
举个例子:
//情况一:
letarr0 = [1,1,1,0,5,6];
uniqueify(arr0);
//输出:[1,0,5,6]
//情况二:
letarr1 = [
{id: 1, name:'xx'},
{id: 1, name:'xx'},
{id: 2, name:'xx'},
{id: 1, name:'xx'},
{id: 1, name:'xx'}
];
uniqueify(arr1, a=>a.id);//假如这里的去重规则依据为id
//输出:
[
{id: 1, name:'xx'},
{id: 2, name:'xx'}
];
//情况三:
letarr2 = [
{name:'xx',sex:'male'},
{name:'xx',sex:'female'},
{name:'xx',sex:'male'},
{name:'aa',sex:'male'},
{name:'aa',sex:'male'}
];
uniqueify(arr2, a=>(a.name+a.sex));//假如这里的去重规则依据为名字和性别均相同,才算是相同
//输出:
[
{name:'xx',sex:'male'},
{name:'xx',sex:'female'},
{name:'aa',sex:'male'}
];
参考答案:
function uniqueify(arr, cb) {
let newArr = [];
if (!cb) {
//cb 不存在, 直接数组去重
newArr = [...new Set(arr)];
} else {
// cb存在
let obj = {};
arr.forEach(item => {
if (!obj[cb(item)]) {
obj[cb(item)] = item;
newArr.push(item);
}
});
}
console.log(newArr);
}
第二题
找出有序数组(从小到大排列)中和为sum的两个数,要求复杂度为O(n),找到一组即可
const arr = [1,9,79,7,97,1]
function sum(arr,sum){
let map = {}
let result = []
arr.forEach(item=>{
if(map[sum-item]){
result = [item,map[sum-item]]
}else{
map[item]= item
}
})
return result||'no result'
}