référence de la liaison à null le pointeur de type 'value_type'
C'est leetcode 26. Étant donné un tableau trié, supprimer les doublons en place de telle sorte que chaque élément apparaître qu'une seule fois et le retour de la nouvelle longueur. Un exemple en est donné nums = [1,1,2]
, la fonction doit retourner [1,2]
.
Ci-dessous mon code. - Je supprimer tous les autres doublons, il suffit de laisser l'un d'entre eux. Cependant j'ai toujours eu une erreur de reference binding to null pointer of type 'value_type'
lors de la soumission. Je vous serais reconnaissant si quelqu'un peut m'aider avec ce!
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
int i = 0;
while(i < nums.size() - 1) {
if (nums[i] == nums[i + 1]) {
nums.erase(nums.begin() + i);
}
else i++;
}
return nums.size();
}
};
- Ne peut pas dupliquer. ideone.com/ppuRg5.
- Montrer un programme complet qui donne le message d'erreur.
- Bon exemple d'un défaut de la suite de tests 😉
Vous devez vous connecter pour publier un commentaire.
vector<T>::size()
renvoie une valeur de typesize_t
, qui est un type non signé. Disons que le vecteur de passe est vide et, par conséquent, le vecteur de longueur est de 0.nums.size() - 1
va provoquer entier underflow et vous allez réellement être en le comparant0
avec un très grand nombre positif. Cela permettra d'évaluer la véritable origine du boucle pour exécuter eti
va passer les limites du tableau.Pour y remédier, vous pouvez lancer
nums.size()
àint
de manière préventive ou de stocker la taille dans une variable de type entier et de les comparer avec que.while (i + 1 < nums.size())
. Cela permettra de travailler aussi longtemps quenums.size()
n'est pasINT_MAX
.La fonction affichée, fonctionne très bien pour un vecteur dont les éléments sont
[1 1 2]
. Voir https://ideone.com/ppuRg5.Cependant, le problème que je vois dans votre fonction, c'est que si vous passiez un vecteur vide, il va courir dans des problèmes.
sera un problème quand
nums
est vide. Vous pouvez préventivement éviter ce problème en revenant de la fonction immédiatement si vous trouvez que c'est un vecteur vide.Aussi, l'utilisation d'un type non signé pour
i
pour éviter les avertissements du compilateur sur la comparaison des entiers signés et non signés.Ce n'est pas une réponse à votre question, mais il serait plus efficace de la solution au problème si vous n'avez pas à redimensionner votre vecteur à chaque fois que vous trouver un duplicata. Juste pour vous donner une idée, vous pourriez avoir deux itérateurs i et j, ai garder l'index du dernier élément unique de votre solution de vecteur et j itération par le vecteur. Quand j des points à une valeur pas la première fois que je les éléments, copie de v[i]. Et une fois que vous avez terminé, supprimez tout le texte de la j-ème place à partir.
Dans mon cas, la raison de ce message d'erreur erreur de segmentation.
Exemple
Pour l'entrée vide:
Il fonctionne OK, quand j'ajoute de vérifier d'entrée vide