0
votes

Two Sum Leetcode en Javascript - le code semble correct mais Leetcode dit que c'est faux

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.


0 commentaires

3 Réponses :


5
votes

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.


1 commentaires

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.



2
votes

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);

Cliquez ici pour exécuter


0 commentaires

1
votes

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))


0 commentaires