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.

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 compiladorSolució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.