Étant donné un tableau comme [2, 7, 5, 3, 9], j'essayais de trouver la paire de valeurs du tableau dont la somme serait égale à 12 et ci-dessous est le code que j'ai écrit

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

Mais le problème auquel je suis confronté est que la valeur est dupliquée dans la console comme indiqué ci-dessous -

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

Si j'ai déjà (5,7), il ne devrait pas être répété comme (7,5) comment puis-je faire cela?

1
swarup 25 févr. 2021 à 03:58

3 réponses

Meilleure réponse

N'imprimez que les cas où diff est inférieur à 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 févr. 2021 à 01:01

Si vous souhaitez simplement supprimer les doublons de votre liste de résultats, stockez chaque diff dans un tableau et vérifiez si la différence de diff ou de diff existe déjà en tant que paire:

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 févr. 2021 à 01:01

La solution la plus simple serait de supprimer l'autre index d'élément du tableau une fois trouvé:

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

Une autre solution avec une meilleure complexité temporelle (O(n) au lieu de O(n ^ 2)) serait de placer les éléments dans un ensemble à la place, en supposant que les doublons ne soient pas un problème:

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

Si les doublons sont une possibilité dont vous devez tenir compte, utilisez plutôt une carte (ou un objet), où les valeurs sont le nombre de fois où la clé (le nombre) a été trouvée dans le tableau d'origine. Lorsqu'une clé qui correspond à une différence est trouvée, enregistrez uniquement si la valeur est supérieure à 0 et décrémentez cette valeur.

2
CertainPerformance 25 févr. 2021 à 01:01