-
Notifications
You must be signed in to change notification settings - Fork 0
Open
Description
// Enunciado:
//Escribir la función depura que reciba un vector de unsigned char y su dimensión
//(no es un string null terminated). El mismo contiene valores repetidos y no está ordenado. La
//función debe dejar en el vector únicamente valores no repetidos y ordenados en forma
//ascendente, también debe retornar la nueva dimensión del vector.
//Se espera que a esta función se la invoque con vectores de miles de
//elementos.
//Ejemplo de uso (en el ejemplo se colocan pocos valores, pero se espera que en un entorno
//real de trabajo el vector recibido tenga varios miles de elementos)
// Dudas: cuando chequeo en el primer if, es lo mismo hacer if(!apariciones[vec[i]]) y if(apariciones[vec[i]] == 0)
#define CHAR_MAX 256
int depura(unsigned char vec[], int dim);
int main(void) {
int n;
unsigned char v[] = {1, 3, 1, 5, 2, 1, 5, 1, 0, 100, 95, 100, 3};
n = depura(v, sizeof(v) / sizeof(v[0]) );
assert(n == 7);
assert(v[0] == 0);
assert(v[1] == 1);
assert(v[2] == 2);
assert(v[3] == 3);
assert(v[4] == 5);
assert(v[5] == 95);
assert(v[6] == 100);
printf("OK\n");
return 0;
}
int depura(unsigned char vec[], int dim)
{
// Creo que no es necesario pero lo chequeo igual (caso vector vacio, no se hace nada)
if(dim == 0)
{
return 0;
}
// creo un vector de apariciones inicializados de 256 posiciones
int apariciones[CHAR_MAX] = {0};
for(int i = 0; i < dim; i++)
{
if(!apariciones[vec[i]]) // seria lo mismo que hacer apariciones[vec[i]] == 0?
{
apariciones[vec[i]] = 1; // si se encontro el elemento marco 1
}
}
// en resp almaceno la nueva dim del vector sin repetidos y en orden ascendente
int resp = 0;
for(int i = 0; i < CHAR_MAX; i++)
{
// el if chequea laprimera aparicion del caracter
if(apariciones[i])
{
vec[resp] = i; // guardo en resp el elemento con la primer aparicion
resp++; // incremento la nueva dim ya que el elemento no estaba repetido y se encontro la primer aparicion
}
}
return resp; // nueva dim con los caracteres sin repetir y en orden ascendente
}Metadata
Metadata
Assignees
Labels
No labels