Otro algoritmo interesante, éste no es muy difícil pero sí va a requerir de tu ingenio, así que comencemos! 😉
Enunciado
Dado un array de números enteros ordenados ascendentemente, remover los elementos duplicados mientras que el orden de los elementos debe permanecer. finalmente debes retornar el número de elementos únicos.
Una particularidad que tiene este ejercicio es que deberás modificar directamente el arreglo inicial, de forma que deberás remover los elementos duplicados in-place, esto quiere decir que este algoritmo opera directamente con la estructura de datos del input.
Una vez que los elementos únicos estén escritos en el arreglo no es necesario hacer nada con los demás elementos, pudiendo dejarlos tal cual.
Puedes utilizar cualuquier estructura de datos sin embargo no deberás utilizar el método Distinct de Linq para hallar elementos únicos.
Por ejemplo:
Si el arreglo inicial se llama initialArray aquí te presento dos casos de uso:
initialArray: [1,1,2]
initialArray final: [1,2,X] donde X puede ser cualquier valor
Retorno: 2 ya que hay 2 elementos únicos
initialArray: [1,1,1,2,2,3]
initialArray final: [1,2,3,X,X,X]
Retorno: 3 ya que hay 3 elementos únicos
Inténtalo tú primero, no saltes directo a la solución crack! 🤔👀
Algoritmo
Para resolver este ejercicio hacer lo siguiente:
- Iterar por cada elemento del arreglo inicial.
- Insertar el elemento en un HashSet (estructura de datos que siempre almacena valores únicos)
- Mediante un contador detectar si ha cambiado la cantidad de elementos del HashSet
- Si ha habido aumento, entonces sobre-escribir un elemento en el arreglo inicial. Llevar la cuenta de los índices con otro contador.
- Retornar cantidad de elementos del HashSet.
Como notarás aquí usamos HashSet, y con esto queda demostrado que aprender estructuras de datos es muy importante. En esta entrada te hablo de las estructuras de datos en .NET 😉
Código
public int RemoveDuplicates(int[] initialArray) {
var hash = new HashSet<int>();
int lastCounter = 0;
int internalCounter = 0;
foreach(var item in initialArray){
hash.Add(item);
if(hash.Count > lastCounter){
initialArray[internalCounter] = item;
internalCounter++;
lastCounter = hash.Count;
}
}
return hash.Count;
}
Recuerda que esta entrada es de la serie de artículos Algoritmos notables, los cuales los subo a este repo, puedes visitarlo y descubrir más algoritmos 😉
Si te ha fascinado esta entrada compártela pues crack 🫡