1
votes

Utilisation d'une fonction de carte au lieu d'une condition de boucle imbriquée JS

J'ai la fonction suivante qui prend dans un tableau de nombres et une valeur cible, si 2 des nombres du tableau peuvent être ajoutés pour donner la valeur cible, la fonction retourne true, sinon elle retourne false. Par exemple, si array = [5,4,2,3,1] et target = 9, la fonction doit renvoyer true comme 5 + 4 = 9. Cependant, si target = 10, la fonction doit renvoyer false car aucun nombre de 2 dans le tableau ne peut être ajouté pour donner 10.

function Solution(array,target) {
    for (var i = 0;i<array.length;i++) {
      for (var j=0;j!=i && j<array.length;j++) {
        if (array[i] + array[j] == target) {
        return true
      }
    }
  }
  return false
}

La fonction ci-dessus fonctionne comme prévu, mais je ne pense pas que ce soit une bonne façon de le faire, quelqu'un peut-il me montrer un moyen plus efficace d'utiliser une fonction de carte?


1 commentaires

.map ne convient pas vraiment ici. Cela fonctionne en quelque sorte, mais uniquement en conjonction avec d'autres méthodes de tableau. Même dans ce cas, votre code n'est pas vraiment faux. Je changerais simplement var j=0;j!=i en j = i+1 et var s pour let s.


3 Réponses :


1
votes

Vous pouvez prendre une table de hachage avec le delta nécessaire comme clé.

Cette approche ne nécessite qu'une seule itération.

function solution(array, target) {
    const seen = {};
    for (const value of array) {
        if (seen[value]) return true;
        seen[target - value] = true;
    }
    return false;
}

console.log(solution([5, 4, 3, 2, 1], 9));  //  true
console.log(solution([5, 4, 3, 2, 1], 10)); // false


0 commentaires

0
votes

Vous pouvez gérer un Set pour le rendre plus efficace.

Lorsque vous rencontrez un nouveau nombre dans votre tableau, soustrayez ce nombre de la somme cible. Cela vous indiquera le montant que vous devez ajouter avec le nombre actuel pour atteindre la somme cible. Vous pouvez vérifier si ce nombre / montant est dans l'ensemble dans O (1) en utilisant .has() . S'il fait partie de l'ensemble, vous pouvez renvoyer true, sinon vous pouvez ajouter le numéro à votre ensemble à vérifier pour d'autres itérations de votre tableau.

Voir l'exemple ci-dessous:

function solution(array, target) {
  const set = new Set();
  for(const num of array) {
    if(set.has(target-num))
      return true;
    else
      set.add(num);
  }
  return false;
}

console.log(solution([5,4,2,3,1], 9));


0 commentaires

0
votes

Voici une solution simple en une ligne utilisant une méthode de tableau.

const Solution = (array, target) =>
  array.some((x, i) => array.some((y, j) => i !== j && x + y === target));

console.log(Solution([5, 4, 2, 3, 1], 9));
console.log(Solution([5, 4, 3, 2, 1], 10));
console.log(Solution([5, 4, 3, 2, 1], 5));


2 commentaires

Vous pouvez utiliser i !== j && x + y === target au lieu de (i !== j ? x + y === target : false) .


@Yousername merci, j'ai mis à jour mon code.