Je travaille sur le problème «Two Sum» dans Leetcode .
Je suis sûr que ce code est correct, je l'ai testé dans Repl et il semble correct là-bas, mais Leetcode me donne une erreur.
Voici mon code:
Input: [3,2,4] 6 Output: [0,1,1,2] Expected: [1,2]
L'erreur que j'obtiens est la suivante:
var arr = []; var twoSum = function(nums, target) { for(var i = 0; i < nums.length; i++){ for(var j = i+1; j < nums.length; j++){ console.log(nums[i] + ', ' + nums[j]); var tot = nums[i] + nums[j]; if(tot === target){ arr.push(i,j); console.log(arr); return arr; } } } }; //var a = [2, 7, 11, 15]; //var b = 9; var a = [2, 3, 4]; var b = 6; twoSum(a, b);
Pourquoi attend-il [1, 2]
? Il devrait sûrement s'attendre à [0, 1]
dans ce cas, et alors pourquoi mon code s'ajoute-t-il deux fois au tableau arr? Cela ressemble à un bug pour moi ...
Remarque: je vois qu'il y a de nombreux articles sur ce problème sur Leetcode, mais aucun ne traite du problème spécifique que j'ai rencontré en Javascript.
3 Réponses :
Pourquoi attend-il [1, 2]?
Parce que 2 + 4 = 6
Il devrait sûrement s’attendre à [0, 1] dans ce cas
Non, car 3 + 2 = 5
et alors pourquoi mon code s'ajoute-t-il deux fois au tableau arr?
Parce que vous avez déclaré le tableau en dehors de la fonction. Il est réutilisé pour chaque appel à la fonction. Déplacez la déclaration du tableau dans votre fonction twoSum
ou mieux: return [i, j]
simplement return [i, j]
au lieu de push
dans le tableau vide.
Merci d'avoir déplacé le tableau dans la fonction qui l'a corrigé. J'adore la dyslexie, pour une raison quelconque, mon cerveau avait décidé que je devais trouver le produit et non la somme, et faisait quelque chose de bizarre avec ça. Hrrumff.
Voici une autre solution que vous pouvez essayer ...
var twoSum = function(nums, target) { let map = {}; for (let i = 0; i < nums.length; i++) { let compliment = target - nums[i]; if (map[compliment]) { return [(map[compliment] - 1), i]; } else { map[nums[i]] = i + 1; } } }; twoSum([2, 3, 4],6);
Voici une solution optimale
/** * @param {number[]} nums * @param {number} target * @return {number[]} */ function twoSum(nums, target) { const numsObjs = {}; // create nums obj with value as key and index as value eg: [2,7,11,15] => {2: 0, 7: 1, 11: 2, 15: 3} for (let i = 0; i < nums.length; i++) { const currentValue = nums[i]; if (target - currentValue in numsObjs) { return [i, numsObjs[target - currentValue]]; } numsObjs[nums[i]] = i; } return [-1, -1]; } console.log(twoSum([2, 7, 11, 15], 9))