J'essaie d'écrire une fonction qui, étant donné un tableau et N, renvoie la matrice avec des éléments qui ne se répètent pas plus que n fois. Je ne peux pas changer l'ordre de la matrice.
ci-dessous est le code que j'ai jusqu'à présent. Ce qui me perplexe est que cela fonctionne pour la plupart des éléments d'une matrice donnée, mais pas pour d'autres. J'essaie de trouver une rime ou une raison pour laquelle les éléments pour lesquels le code ne fonctionne pas. P>
p>
[7, 26, 21, 41, 43, 2, 26, 24, 10, 10, 24, 35, 35, 43, 41, 7, 21, 2, 28]
6 Réponses :
Pour une version de mutation rapide, vous pouvez utiliser un seul p>
pendant la boucle code>, une table de hachage pour compter les éléments et un ajustement de l'index si une épissure se produit. .as-console-wrapper { max-height: 100% !important; top: 0; }
Ces deux solutions renvoient des tableaux de retour avec plus de deux 10 personnes.
@Scottsauyet, désolé raté cela.
Eh bien, le second est corrigé. Une exception maintenant dans le premier.
Ce filtre (avec un objet, pas une carte) est définitivement plus agréable que le mien.
Merci beaucoup, Nina. Aimer la brièveté de ce second.
Ce code fonctionne:
p>
function deleteNth(arr,n){
var rem = new Array(), new_arr = new Array();
arr.forEach(function (item, index) {
if(!rem[item]) rem[item]=0;
if(rem[item]<n){
new_arr.push(item);
rem[item]++;
}
});
return new_arr;
}
console.log(deleteNth([7, 26, 21, 41, 43, 2, 26, 24, 10, 26, 10, 10, 24, 35, 35, 35, 43, 26, 41, 7, 24, 24, 21, 24, 10, 35, 10, 7, 24, 7, 35, 26, 41, 35, 2, 43, 24, 2, 41, 26, 41, 7, 7, 26, 2, 10, 43, 10, 35, 41, 24, 7, 2, 2, 7, 2, 26, 24, 26, 43, 43, 21, 10, 28, 10], 2));Cette méthode est plus efficace
La logique de l'endroit où vous place la boucle tandis que la boucle est fausse, vous devez le placer en dehors de la boucle pour la boucle pour.
p>
function cleanUp (arr, max) {
const cnts = {} // keep track of what we find
return arr.reduce((a, i) => { // loop over the array index by index
cnts[i] = (cnts[i] || 0) + 1; // mark that I seen the number
if (cnts[i] <= max) { // check to see if we are under the max
a.push(i) //if we are, add it to an arry
}
return a // return the array for reduce
}, [])
}
console.log(cleanUp([7, 26, 21, 41, 43, 2, 26, 24, 10, 26, 10, 10, 24, 35, 35,
35, 43, 26, 41, 7, 24, 24, 21, 24, 10, 35, 10, 7, 24, 7, 35, 26, 41,
35, 2, 43, 24, 2, 41, 26, 41, 7, 7, 26, 2, 10, 43, 10, 35, 41, 24, 7,
2, 2, 7, 2, 26, 24, 26, 43, 43, 21, 10, 28, 10], 2))Ohhh je vois. C'est exactement ce que j'essayais de comprendre (le premier bloc de code que vous avez écrit). Je prends certainement votre point de créer un nouveau tableau au lieu de changer l'original. Merci pour l'aide!
Vous pouvez .concat code> au lieu de .push code> pour réduire le plus néfaste.
Tout votre code est vrai. Il suffit d'apporter ce p> pendant code> de pour code> boucle. function deleteNth(arr, n) {
arr.forEach(function(item, index) {
var count = 0;
for (var i = 0; i < arr.length; i++) {
if (arr[i] === item) {
count++;
}
}
while (count > n) {
var remove = arr.lastIndexOf(item);
arr.splice(remove, 1);
count--;
}
});
return arr;
}
var x = deleteNth([7, 26, 21, 41, 43, 2, 26, 24, 10, 26, 10, 10, 24, 35, 35,
35, 43, 26, 41, 7, 24, 24, 21, 24, 10, 35, 10, 7, 24, 7, 35, 26, 41,
35, 2, 43, 24, 2, 41, 26, 41, 7, 7, 26, 2, 10, 43, 10, 35, 41, 24, 7,
2, 2, 7, 2, 26, 24, 26, 43, 43, 21, 10, 28, 10
], 2);
console.log(x);
Merci, Saeed. J'apprécie que vos commentaires!
J'aime le filtre de Nina (fonctionne probablement mieux aussi), mais vous pouvez également utiliser:
p>
function deleteNth(arr,n){
const map = new Map();
return arr.filter(
item=>{
const count = (map.get(item)||0)+1;
map.set(item,count);
return (count<=n);
}
);
}
console.log(deleteNth([1,2,3,2,4,2,5], 2));
Si vous voulez vraiment le faire en place, cette réponse n'est pas pour vous. (Je pense qu'il y a de très bonnes raisons de travailler avec des données immuables, mais si vous voulez muter, l'une des autres réponses devrait le faire.
Voici une solution qui conserve tout simplement un nombre de chaque élément vu comme vous l'allez, et filtres ceux que nous avons vus trop souvent: p>
p>
deleteNth = (n) => (arr) => { /* ... */ }
Merci, Scott. Cela semble être une solution efficace. Je ne suis pas collé à l'idée de changer en place - juste un débutant essayant d'obtenir une bonne adhérence sur les bases. En ce qui concerne le nom, je suis d'accord, mais les mots de code veulent le nom de sa création :)
Ahh, codeewars. Cela fait longtemps! Bonne chance. Si vous aimez cette idée, regardez la solution de Nina. C'est un peu plus propre que le mien.
Je ferai ça! Merci encore!
La façon dont vous attaquez cela semble être une mauvaise façon de le faire. Une boucle simple où vous gardez une trace de ce qui est utilisé et ajouté à un nouveau tableau semblerait une meilleure approche. Beaucoup moins de boucler.
Quelle est la valeur de n?
@Nicholasmansfield dans l'exemple de mise au-dessus, n = 2.
@epascarello je pense que tu as raison. Je pensais juste qu'il y aurait de la valeur pour déterminer pourquoi celui-ci ne fonctionne pas, car il semble que cela devrait.
Une fonction qui mutent l'entrée peut explicitement renvoyer indéfini, c'est-à-dire un bon moyen d'indiquer la fonction impure. Vous pouvez retourner un nouveau tableau avec les modifications et laisser l'entrée intacte.
éléments répétant code> Significationne pas répéter code>. Vous voulez dire si l'élément est dans la matrice plus que n fois dans un ordre particulier n'ajoute pas l'élément lorsqu'il dépassait n. donc[1,2,1,2,3,2,5], 2 code> serait[1,2,1,2,3,5] code> le 2 entre 3 et 5 est supprimé parce que c'est le 3ème 2