Online C Compiler
Abrir en el compilador

Edición didáctica en español. El código y sus salidas conservan el original.

Ejercicios de arrays en C: elimina duplicados

Elimina duplicados de un array ordenado en C con dos índices. Conserva los valores únicos en el mismo array e imprime su cantidad y sus valores.

Abrir en el compilador

Ejercicios de arrays en C: elimina duplicados
Elimina duplicados de un array ordenado en C con dos índices. Conserva los valores únicos en el mismo array e imprime su cantidad y sus valores.

Lee N y un array de N enteros ordenados de menor a mayor. Elimina los valores repetidos sin crear un segundo array. Conserva una sola aparición de cada valor e imprime la nueva longitud y los elementos únicos.

Usa un índice de lectura y otro de escritura. Si el valor leído difiere del último conservado, cópialo a arr[write] y avanza la escritura. Con N = 1 no cambia nada; si todos son iguales, queda un valor.

Entrada

Primera línea: N. Segunda línea: N enteros ordenados de menor a mayor.

Salida

Primera línea: cantidad de valores únicos. Segunda línea: esos valores separados por espacios.

Restricciones

  • 1 <= N <= 1000
  • -1000 <= arr[i] <= 1000
  • Entrada ordenada de menor a mayor.
  • Usa O(1) de memoria auxiliar.
Pistas
  • Conserva el primer elemento: N es al menos uno.
  • Compara cada valor con el último conservado.

Código C

#include <stdio.h>

#define MAX_N 1000

int remove_duplicates(int arr[], int n) {
    // TODO: Compact unique values into arr[0..write-1] and return write.
    (void)arr;
    return n;
}

int main(void) {
    int n;
    if (scanf("%d", &n) != 1 || n < 1 || n > MAX_N) return 1;
    int arr[MAX_N];
    for (int i = 0; i < n; ++i) {
        if (scanf("%d", &arr[i]) != 1 || arr[i] < -1000 || arr[i] > 1000) return 1;
        if (i > 0 && arr[i] < arr[i - 1]) return 1;
    }
    int length = remove_duplicates(arr, n);
    printf("%d\n", length);
    for (int i = 0; i < length; ++i) {
        printf("%d%c", arr[i], i == length - 1 ? '\n' : ' ');
    }
    return 0;
}
Abrir en el compilador
Solución y explicación

Inicia write en 1. Recorre el array desde read = 1; copia arr[read] a arr[write] solo si difiere de arr[write - 1], e incrementa write.

Imprime write y el prefijo de esa longitud. El algoritmo tarda O(N) y usa O(1) de memoria auxiliar.

Código de la solución

#include <stdio.h>

#define MAX_N 1000

int remove_duplicates(int arr[], int n) {
    int write = 1;
    for (int read = 1; read < n; ++read) {
        if (arr[read] != arr[write - 1]) {
            arr[write] = arr[read];
            ++write;
        }
    }
    return write;
}

int main(void) {
    int n;
    if (scanf("%d", &n) != 1 || n < 1 || n > MAX_N) return 1;
    int arr[MAX_N];
    for (int i = 0; i < n; ++i) {
        if (scanf("%d", &arr[i]) != 1 || arr[i] < -1000 || arr[i] > 1000) return 1;
        if (i > 0 && arr[i] < arr[i - 1]) return 1;
    }
    int length = remove_duplicates(arr, n);
    printf("%d\n", length);
    for (int i = 0; i < length; ++i) {
        printf("%d%c", arr[i], i == length - 1 ? '\n' : ' ');
    }
    return 0;
}

Preguntas frecuentes

¿Por qué el código y la salida siguen en inglés?

Las palabras clave, los identificadores y los textos que verifican las pruebas se conservan para no cambiar el programa. Las explicaciones y los controles están traducidos.