首页 > 解决方案 > 使用javascript从数组中获取值等于特定总和的元素对

问题描述

给定一个数组 [2, 7, 5, 3, 9] 我试图从数组中找到总和等于 12 的值对,下面是我编写的代码

let arr1 = [2, 7, 5, 3, 9]
let addSum = 12;

for (let i = 0; i < arr1.length; i++) {
  let diff = addSum - arr1[i];
  if (arr1.includes(diff)) {
    console.log('Arr pair has value' + diff + ': ' + arr1[i]);
  }
}

但我面临的问题是控制台中的值重复,如下所示 -

Arr pair has value5: 7
Arr pair has value7: 5
Arr pair has value9: 3
Arr pair has value3: 9

如果我已经拥有(5,7)它不应该重复,因为(7,5)我该怎么做?

标签: javascriptarrays

解决方案


最简单的解决方案是在找到时从数组中删除其他项索引:

let arr = [2, 7, 5, 3, 9]
let addSum = 12;

for (let i = 0; i < arr.length; i++){
    let diff = addSum - arr[i];
    const index = arr.indexOf(diff);
    if (index !== -1) {
        console.log('Arr pair has value' + arr[index] + ': '+arr[i]);
        arr.splice(index, 1);
        i--; // to avoid skipping the next one from the array indicies shifting down
    }
}

另一个具有更好时间复杂度(O(n)而不是O(n ^ 2))的解决方案是将项目放入 Set 中,假设重复不是问题:

const set = new Set([2, 7, 5, 3, 9]);
let addSum = 12;
for (const item of set) {
  const diff = addSum - item;
  if (set.has(diff)) {
    console.log('Arr pair has value' + item + ': '+diff);
    set.delete(diff);
  }
}

如果您需要考虑重复可能性,请改用 Map(或对象),其中值是在原始数组中找到键(数字)的次数。当找到与 diff 匹配的键时,仅当值大于 0 时记录,并减少该值。


推荐阅读