Skip to content

ej_depura #9

@pkorenblit

Description

@pkorenblit
// 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

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions