0
votes

Pourquoi ma sortie est-elle vide lorsque je convertis un ensemble en tableau?

Je suis en train de résoudre Leetcode 26 Supprimer les doublons du tableau trié avec les instructions suivantes:

Étant donné un tableau trié nums, supprimez les doublons sur place de telle sorte que chaque élément n'apparaît qu'une seule fois et renvoie la nouvelle longueur.

N'allouez pas d'espace supplémentaire pour un autre tableau, vous devez le faire en modifier le tableau d'entrée sur place avec de la mémoire supplémentaire O (1).

Ma solution a d'abord été de créer un ensemble, d'itérer chaque nombre dans le tableau et d'ajouter chacun à l'ensemble et de simplement convertir l'ensemble en un tableau.

var removeDuplicates = function(nums) {
  let set = new Set();
  for (let num of nums) {
    set.add(num);
  }
  return Array.from(set); 
};

Lorsque je console.log mon tableau, il renvoie la réponse que Leetcode recherche mais lorsque je soumets, la sortie est [] . Pourquoi cela se produit-il?


1 commentaires

"vous devez le faire en modifiant le tableau d'entrée sur place avec de la mémoire supplémentaire O (1)." La création d'un ensemble enfreint cette instruction.


4 Réponses :


0
votes

Apparemment, la création d'un ensemble viole l'instruction selon laquelle je dois modifier le tableau d'entrée sur place avec O (1) de mémoire supplémentaire.


0 commentaires

-1
votes

Vous pouvez utiliser la méthode de réduction et renvoyer la longueur du tableau.

var removeDuplicates = function (nums) {
    return [...new Set(nums)].length
}

Ou une approche différente utilisant l'ensemble

var removeDuplicates = function (nums) {
  return nums.reduce(function (accumulator, currentValue) {
    if (accumulator.indexOf(currentValue) === -1) {
      accumulator.push(currentValue);
    }
    return accumulator;
  }, []).length;
};


2 commentaires

l'exécution de cette solution avec le scénario de test échoue.


puis-je savoir quel est le message d'échec?



1
votes

Pour répondre à la question principale, vous feriez mieux d'utiliser set.values ​​() pour obtenir toutes les valeurs de set, comme ceci

return [...set.values()]

Mais comme vous l'avez dit, créer un nouvel ensemble prendra de la mémoire supplémentaire et viole la mémoire O (1); Une solution simple serait de parcourir les éléments et de conserver l'élément précédent dans une variable, si l'élément actuel est égal à l'élément précédent, supprimez l'élément actuel. Puis retournez la longueur du tableau à la fin


0 commentaires

0
votes

Vous pouvez faire quelque chose comme ceci

var removeDuplicates = function(nums) {
    if(nums.length === 0) return 0;
    let i =0;
    for(let j= 1; j < nums.length ; j++){
        if(nums[j] != nums[i]){
             nums.splice(i,i+1);
            i++;
            }
    }
  
    return i +1;
};

nums =[0,0,1,1,1,2,2,3,3,4];

console.log("Count :",removeDuplicates(nums),nums)


0 commentaires