1.给定一组数据要求找出数组中任意三个数和为0
法二:三数和算法(时间复杂度(O^2))
但是有一个小问题(打印的时候会连function一起打印出来不知道为什么(按理说console.log()中应该会转换类型为字符串而调用toString()才对))希望大神可以指点一下
如[-1, 0, 1, 2, -1, 4],返回[-1,-1,2][-1,0,1]
首先找出数组中所有和为0的组合:
解法一:枚举(时间复杂度O^3)
function query(arr){
let result = [];
let len = arr.length;
for(let i=0; i<len-2; i++){
for(let j=i+1; j<len-1; j++){
for(let k=j+1; k<len; k++){
if(arr[i]+arr[j]+arr[k] == 0){
let a = [];
a.push(arr[i], arr[j], arr[k]);
result.push(a);
}
}
}
}
return result;
}
法二:三数和算法(时间复杂度(O^2))
首先要求数组必须是有序的,所以先对数组进行排序
假设数组是升序的:
i指向数组中的第一个数
j指向i后一个数
k指向数组最后一个数
如果arr[i]+arr[j]+arr[k] == 0,那么j++,k--
如果arr[i]+arr[j]+arr[k] > 0, 那么k--
如果arr[i]+arr[j]+arr[k] < 0, 那么j++
function query(arr) {
arr.sort(function(a,b){
return a-b;
})
let result = [];
let len = arr.length;
for (let i = 0; i < len - 2; i++) {
let j = i + 1;
let k = len - 1;
while (k > j) {
if(arr[i]+arr[j]+arr[k] == 0){
let a = [];
a.push(arr[i], arr[j], arr[k]);
result.push(a);
j++;
k--;
}else{
if(arr[i]+arr[j]+arr[k] > 0){
k--;
}else{
j++;
}
}
}
}
return result;
}
由于题目要求集合类似[1,0,-1]和[-1,0,1]只能算一个解所以需要对数组进行去重处理
function unique(result){
let obj = {};
let arr = [];
result.forEach(function(item){
item.sort(function(a,b){
return a-b;
});
obj[item.join()] = 1;
})
keys = Object.keys(obj);
keys.forEach(function(item){
arr.push(item.split(","));
})
return arr;
}
2.实现如下函数(具体不记得了,大致这个意思):
console.log(fun(2)(3))//6console.log(fun(3)(4)(2))//24
典型的可以用闭包实现
function fun(x) {
let sum = x;
let tmp = function (y) {
sum *= y;
return tmp;
}
tmp.toString = function () {
return sum;
}
return tmp;
}