Vous allez recevoir un tableau d'entiers. Votre travail consiste à prendre ce tableau et à trouver un index N où la somme des entiers à gauche de N est égale à la somme des entiers à droite de N.S'il n'y a pas d'index qui ferait cela, retournez - 1.
Par exemple:
Disons qu'on vous donne le tableau {1,2,3,4,3,2,1}: Votre fonction renverra l'index 3, car à la 3ème position du tableau, la somme du côté gauche de l'index ({1,2,3}) et la somme du côté droit de l'index ({3,2,1}) sont toutes deux égales à 6.
Réponse
function findEvenIndex(arr){
for(let i = 0; i <arr.length; i++){
let arr1 = arr.slice(0, (arr[i] - 1));
let arr2 = arr.slice((arr[i] + 1),);
let arr11 = arr1.reduce((total, item)=>{
return total + item;
}, 0);
let arr22 = arr2.reduce((total, item)=>{
return total + item;
}, 0);
if(arr11 === arr22){
return arr[i];
}
}
return -1;
}
console.log(findEvenIndex([1, 2, 3, 4, 3, 2, 1]))
console.log(findEvenIndex([1, 100, 50, -51, 1, 1]))
console.log(findEvenIndex([1, 2, 3,4,5,6]))
Je ne vois pas d'erreur ici, mais cela donne des résultats incorrects. Des idées?
3 Réponses :
Vous avez cette partie:
let arr = [0,1,2,3,4] let x = 2; console.log(arr.slice(0, x - 1)); console.log(arr.slice(x + 1,));
Ceci est incorrect: arr [i] . C'est une valeur , par exemple dans [2,4,6,8,10] arr [3] == 8 . Vous voulez découper l'index lui-même:
let arr1 = arr.slice(0, i - 1); let arr2 = arr.slice(i + 1,);
Attention: il y a une autre erreur dans les deux lignes :) Je vous laisse cela. Astuce: vous découpez maintenant deux valeurs du tableau au lieu d'une. Exécutez d'abord le code suivant dans votre tête, puis à un endroit où vous vérifiez vos résultats.
let arr1 = arr.slice(0, (arr[i] - 1)); let arr2 = arr.slice((arr[i] + 1),);
Vous avez besoin de crochets dans la fonction de tranche, n'est-ce pas? Ma formule ne fonctionne toujours pas: 'D
C'est certainement une amélioration, mais lorsque i est à zéro, la mauvaise chose se produira.
Pas les crochets, le code est syntaxiquement correct :) J'ai ajouté un petit coup de pouce dans le sens de la solution
@Pointy Correct. Mais la bonne solution non plus. Je laisse les cas de bord hors de lui pour simplifier
vous renvoyez arr [i] lorsque vous devez retourner seulement i
Bien que correct, ici sur SO, nous préférons les petits exemples. Parfois, cela en dit plus que n'importe quel texte normal :)
Vous pouvez également utiliser la méthode de tableau findIndex , qui, nous ne devrions pas être surpris d'apprendre, trouve un index dans un tableau soumis à une certaine condition.
const sum = (ns) => ns .reduce ((total, n) => total + n, 0) const findBalancedIndex = (ns) => ns .findIndex ((_, i) => sum (ns.slice (0, i)) === sum (ns.slice (i + 1))) console .log (findBalancedIndex ([1, 2, 3, 4, 3, 2, 1])) console .log (findBalancedIndex ([1, 100, 50, -51, 1, 1])) console .log (findBalancedIndex ([1, 2, 3, 4, 5, 6]))
Ici, nous incluons une simple fonction d'aide pour trouver la somme d'un tableau, puis nous passons une fonction à findIndex qui l'utilise deux fois sur les éléments avant l'index et ceux après il. Nous utilisons le deuxième paramètre de la fonction de rappel, l ' index pour ce faire. Cela signifie que nous sautons complètement le premier paramètre, et plutôt que de le nommer avec quelque chose comme n , nous utilisons la convention quelque peu courante de l'appeler _ , signalant un espace réservé que nous avons gagné pas utiliser. Notez que vous n'avez pas besoin d'en soustraire un de la limite de droite de la tranche , car cette valeur de limite est déjà exclue. Et bien sûr, d'autres ont souligné que vous devez découper l'index et non la valeur du tableau à cet index.
Ceci trouve le premier index correct. Vous devrez utiliser une technique différente si vous vouliez trouver tous ces indices. (Qu'il soit possible d'en avoir plus d'un devrait être clair dans les tableaux comme [1, 2, 3, 0, 0, 0, 0, 3, 2, 1] - les indices pour tous ceux 0 fonctionnerait.)
let arr1 = arr.slice (0, (arr [i] - 1));pourquoi découpez-vous en utilisant la valeur de l'index dans le tableau?Vous devez renvoyer
i, pasarr [i](aussi, oui:i = 1; i et utilisez ipour la commande slice, pas le nombre arbitraire stocké dans le tableau)function findEvenIndex (arr) {for (let i = 0; i {return total + item;}, 0); let arr22 = arr2.reduce ((total, item) => {return total + item;}, 0); if (arr11 === arr22) {retourne i; }} return -1; } fournit toujours la mauvaise sortie
Vous n'avez pas vraiment besoin d'utiliser
.slice ()du tout; les nombres sont déjà présents dans le tableau, donc faire de nombreuses copies de parties du tableau est un gaspillage.Correction avec
slice (): jsfiddle.net/ng1uL3qo