2
votes

Comment parcourir un tableau plusieurs fois sans répéter les éléments additionnés

J'essaie de résoudre ce problème mais je ne sais pas pourquoi je ne peux pas réussir tous les cas de test. J'ai besoin d'aide et d'explications, comment puis-je compter plusieurs fois un tableau (dans cet exemple: variable s) et ne pas répéter les mêmes éléments que j'ai déjà sommés.

Description du problème:

Lily a une barre de chocolat qu'elle souhaite partager avec Ron pour son anniversaire. Chacun des carrés a un entier dessus. Elle décide de partager un segment contigu de la barre sélectionnée de telle sorte que la longueur du segment corresponde au mois de naissance de Ron et que la somme des nombres entiers sur les carrés soit égale à son jour de naissance. Vous devez déterminer de combien de façons elle peut diviser le chocolat.

Considérez la barre de chocolat comme un tableau de carrés, s=[2,2,1,3,2] . Elle veut trouver des segments totalisant le jour de naissance de Ron, d=4 avec une longueur égale à son mois de naissance, m = 2. Dans ce cas, il y a deux segments répondant à ses critères: [2,2] et [1,3] .

Description de la fonction

Complétez la fonction anniversaire dans l'éditeur ci-dessous. Il devrait renvoyer un entier indiquant le nombre de façons dont Lily peut diviser la barre de chocolat.

anniversaire a le (s) paramètre (s) suivant (s):

s: un tableau d'entiers, les nombres sur chacun des carrés de chocolat, d: un entier, le jour de naissance de Ron, m: un entier, le mois de naissance de Ron

Mon code:

function birthday(s, d, m) {
    let bars = 0;

    if (m !== 1) {
        s.reduce((acc, val) => (acc+val) === d ? ++bars : bars)
    } else {
        bars = 1;
    }

    return bars;
}

Certains cas:

  • s = [2, 5, 1, 3, 4, 4, 3, 5, 1, 1, 2, 1, 4, 1, 3, 3, 4, 2, 1]

  • d = 18

  • m = 7

  • s = [4, 5, 4, 5, 1, 2, 1, 4, 3, 2, 4, 4, 3, 5, 2, 2, 5, 4, 3, 2, 3, 5, 2, 1 , 5, 2, 3, 1, 2, 3, 3, 1, 2, 5]

  • d = 18

  • m = 6

  • s = [4, 5, 4, 2, 4, 5, 2, 3, 2, 1, 1, 5, 4]

  • d = 15

  • m = 4

Mon code fonctionne avec ceci:

  • s = [1, 2, 1, 3, 2]
  • d = 3
  • m = 2

Cela peut être trouvé sur HackerRank> Pratique> Algorithmes> Implémentation


3 commentaires

Puis-je supposer que le tableau s ne peut pas être trié avant d'ajouter ou que nous pouvons trier avant d'ajouter?


Je suppose que cela peut être trié. Le point est de faire la somme des éléments de s pour être égale à d et, le nombre d'éléments additionnés à d est m


D'après la description du problème, il ne semble pas que vous soyez autorisé à trier le tableau.


3 Réponses :


1
votes

Chaque fois que vous bouclez sur un tableau pour obtenir la sommation ou faire une équation mathématique dessus et que vous devez supprimer cet élément spécifique que vous avez déjà calculé, vous pouvez utiliser l'une de ces fonctions intégrées pour supprimer un élément d'un tableau en utilisant un élément spécifique indice. Array.prototype.slice () && Array.prototype.splice ()


0 commentaires

1
votes

Il vous suffit de découper le tableau avec la longueur découpée de m , puis de comparer cela à d

Comme slice doc :

La méthode slice() retourne une copie superficielle d'une partie d'un tableau dans un nouvel objet tableau sélectionné du start à la end ( end non incluse) où le start et la end représentent l'index des éléments de ce tableau. Le tableau d'origine ne sera pas modifié.

Par exemple:

function birthday(s, d, m) {
  let res = 0
  const sum = (arr) => arr.reduce((acc, el) => acc + el, 0)

  for (let i = 0; i < s.length - m + 1; i++) {
    if (sum(s.slice(i, i + m)) === d) {
      res++
    }
  }
  
  return res
}

Voici une solution travaillée

s = [1, 2, 1, 3, 2]
m = 2 
d = 3

// We loop through s with index stop at s.length - m + 1 for slice to be in correct range

// Slices:
i=0: [1, 2] -> sum=3 -> res=0+1=1
i=1: [2, 1] -> sum=3 -> res=1+1=2
i=2: [1, 3] -> sum=4 -> do nothing
i=4: [3, 2] -> sum=5 -> do nothing
 

entrez la description de l'image ici


0 commentaires

1
votes

Voici un moyen facile à comprendre avec les boucles imbriquées:

function birthday(s, d, m) {
    var matches = 0; // Total matches found

    // Look at chunks starting a position 0. Last chunk can't be m spots past end of array, so last chunk starts at 1 + s.length - m:
    for ( let i=0; i < 1 + s.length - m; i++ ) {
        var sum = 0; // What this chunk sums to

        // Sum up the values of this chunk:
        for ( let j=0; j < m; j++ ) {
            sum += s[i+j];
        }
        if ( sum === d ) { // Does this chunk sum to d?
            matches++; // Yes!
        }
    }

    return matches;
}


0 commentaires