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?
4 Réponses :
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.
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;
};
l'exécution de cette solution avec le scénario de test échoue.
puis-je savoir quel est le message d'échec?
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
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)
"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
ensembleenfreint cette instruction.