面试是真的会紧张, 面试的时候被要求写这道题,没有快速写出来就放弃了。
现在一写就写完了,想想实在是记得记录一下啊啊啊啊啊
题目:
给出一个数组,例如[1, 9, 8, 4, 5, -1, -8, 5, 2, 3, 6, 0, 0];
给出一个 目标值, 例如 5;
返回 数组中可以 计算得出 目标值的所有组合例如
[ [1, 4], [-1, 6], [2, 3] ]
以下就是我写的答案(再次崩溃,为啥面试的时候没有写出来呢啊啊啊)
const numArrry = [1, 9, 8, 4, 5, -1, -8, 5, 2, 3, 6, 0, 0];
const targetNum = 5;
function getResult(numArrry, targetNum) {
const length = numArrry.length;
// 先写边界检测
if ( length< 2) return '非法输入';
// 如果正好是俩项 且相加正好为目标值
if ( length === 2 && eval(numArrry.join("+")) === targetNum) {
return [numArrry];
}
// 如果正好是俩项 且相加不为目标值 直接返回空,无需进行计算
if ( length === 2 && eval(numArrry.join("+")) !== targetNum) {
return [];
}
// 以上情况都不是进行判断
let outPut = [];
numArrry.forEach((el, index) => {
const leftNum = numArrry.filter(i => i === targetNum - el)[0];
const idx = numArrry.findIndex(i => i === targetNum - el);
const stringArr = outPut.toString(); // 数组拉平
if ( !isNaN(leftNum) && idx !== index && stringArr.indexOf(leftNum) === -1) {
outPut.push([el, leftNum]);
}
})
// !isNaN(leftNum) 是防止 0 的结果 判断不到
// stringArr.indexOf(leftNum) === -1 是为了重复, 例如结果是 [1, -1] 与 [-1, 1]
return outPut;
}
const result = getResult(numArrry, targetNum);
console.log(result); // [[1, 4], [5, 0], [-1, 6], [2, 3]]