Учитывая массив как [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), как я могу это сделать?

1
swarup 25 Фев 2021 в 03:58

3 ответа

Лучший ответ

Печатайте только те случаи, когда diff меньше arr[i].

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

for (let i = 0; i < arr1.length; i++) {
  let diff = addSum - arr1[i];
  if (diff < arr1[i] && arr1.includes(diff)) {
    console.log('Arr pair has value ' + diff + ': ' + arr1[i]);
  }
}
2
Barmar 25 Фев 2021 в 01:01

Если вы просто хотите удалить дубликаты из списка результатов, сохраните каждый diff в массиве и проверьте, существует ли уже разница diff или diff в виде пары:

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

for (let i = 0; i < arr1.length; i++) {
  let diff = addSum - arr1[i];
  if (arr1.includes(diff)) {
    diffs.push(diff);
    if (!diffs.includes(addSum - diff)) {
      console.log('Arr pair has value ' + diff + ':' + arr1[i]);
    } else {
      diffs.push(arr1[i]);
    }
  }
}
0
Jack Bashford 25 Фев 2021 в 01:01

Самым простым решением было бы удалить индекс другого элемента из массива при обнаружении:

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)) - это поместить элементы в набор вместо этого, при условии, что дубликаты не являются проблемой:

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);
  }
}

Если дубликаты являются возможностью, которые вам необходимо учитывать, используйте вместо них карту (или объект), где значения - это количество раз, когда ключ (число) был найден в исходном массиве. При обнаружении ключа, соответствующего разнице, регистрировать только в том случае, если значение больше 0, и уменьшать это значение.

2
CertainPerformance 25 Фев 2021 в 01:01