05-09-2017, 01:19
Hola a todos:
Quiero compartirles el enunciado y mi resolución de un ejercicio bastante interesante por varios motivos:
1- Para aprender a pensar y analizar.
2- Para cubrir todos los posibles casos de prueba (los famosos "test cases" que las empresas les tiran por la cabeza), para no dejarse encerrar.
3- Porque a pesar de que una resolución puede parecer correcta, no sólo puede no cubrir todos los casos de prueba, sino que además el sistema podría suspender su ejecución por "timed out" o se les podría colgar el terminal, ya verán por qué:
Enunciado: Un vector dinámico se carga con 'n' enteros ('n' siempre es impar). Todos ellos aparecen repetidos de manera par (dos iguales, cuatro iguales, etcétera), menos sólamente uno de ellos.
¿Cuál es ese elemento "aislado"? Encontrarlo e imprimirlo por pantalla.
Ejemplo: int vector[13] = {1, 7, 1, 3, 3, 48, 48, 99, 99, 99, 99, 0, 0} /* el elemento "aislado" es el 7, porque sólo aparece una vez */
Para que no les salte una suspensión de sistema por "timed out" o se les cuelgue el terminal (dado que un "test case" podría involucrar 176538 enteros), siempre les conviene aplicar la aritmética de punteros más que la notación vectorial; pues como sólo maneja direcciones de memoria y no copia y paso de valores (int, long, etcétera) es mucho más veloz y por ende, más eficiente.
Si algo no se ve claro, por favor me preguntan y me vengo en remís, je!
Quiero compartirles el enunciado y mi resolución de un ejercicio bastante interesante por varios motivos:
1- Para aprender a pensar y analizar.
2- Para cubrir todos los posibles casos de prueba (los famosos "test cases" que las empresas les tiran por la cabeza), para no dejarse encerrar.
3- Porque a pesar de que una resolución puede parecer correcta, no sólo puede no cubrir todos los casos de prueba, sino que además el sistema podría suspender su ejecución por "timed out" o se les podría colgar el terminal, ya verán por qué:
Enunciado: Un vector dinámico se carga con 'n' enteros ('n' siempre es impar). Todos ellos aparecen repetidos de manera par (dos iguales, cuatro iguales, etcétera), menos sólamente uno de ellos.
¿Cuál es ese elemento "aislado"? Encontrarlo e imprimirlo por pantalla.
Ejemplo: int vector[13] = {1, 7, 1, 3, 3, 48, 48, 99, 99, 99, 99, 0, 0} /* el elemento "aislado" es el 7, porque sólo aparece una vez */
#include <math.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <assert.h>
#include <limits.h>
#include <stdbool.h>
int main()
{
int n, i, j, aux;
scanf("%d",&n); // ingresar el tamaño del vector dinámico
int *a = malloc(sizeof(int) * n); // reserva de memoria del vector
for(int r = 0; r < n; r++) // ingreso de sus valores
{
scanf("%d",&a[r]);
}
if(n==1)
printf("%d ", *(a+0));
else
{
for(i=0; i<n-1; i++) // ordenamiento ascendente
{
for(j=i+1; j<n; j++)
{
if( *(a+i) > *(a+j) )
{
aux = *(a+i);
*(a+i) = *(a+j);
*(a+j) = aux;
}
}
}
if( *(a+0) < *(a+1) )
printf("%d ", *(a+0));
else if( *(a+(n-2)) < *(a+(n-1)) )
printf("%d ", *(a+(n-1)));
else
{
i=0;
do
{
if( *(a+i) < *(a+(i+1)) )
{
printf("%d", *(a+i));
break;
}
else
i+=2;
}while(i<=n-2);
}
}
return 0;
}
Para que no les salte una suspensión de sistema por "timed out" o se les cuelgue el terminal (dado que un "test case" podría involucrar 176538 enteros), siempre les conviene aplicar la aritmética de punteros más que la notación vectorial; pues como sólo maneja direcciones de memoria y no copia y paso de valores (int, long, etcétera) es mucho más veloz y por ende, más eficiente.
Si algo no se ve claro, por favor me preguntan y me vengo en remís, je!