Edisi pembelajaran bahasa Indonesia. Kode dan keluarannya tetap seperti aslinya.
Latihan Array C: Hapus Nilai Duplikat
Hapus duplikat dari array terurut dalam C dengan dua indeks. Simpan nilai unik di array yang sama, lalu cetak jumlah dan elemen hasilnya.

Baca N dan array berisi N bilangan bulat yang diurutkan dari kecil ke besar. Hapus nilai berulang tanpa membuat array kedua. Simpan satu kemunculan setiap nilai, lalu cetak panjang baru dan elemen uniknya.
Gunakan indeks baca dan indeks tulis. Jika nilai yang dibaca berbeda dari nilai terakhir yang disimpan, salin ke arr[write] dan majukan indeks tulis. Untuk N = 1 tidak ada perubahan; jika semua sama, tersisa satu nilai.
Masukan
Baris pertama: N. Baris kedua: N bilangan bulat terurut dari kecil ke besar.
Keluaran
Baris pertama: jumlah nilai unik. Baris kedua: nilai tersebut dipisahkan spasi.
Batasan
- 1 <= N <= 1000
- -1000 <= arr[i] <= 1000
- Input terurut dari kecil ke besar, boleh sama.
- Gunakan memori tambahan O(1).
Petunjuk
- Simpan elemen pertama karena N minimal satu.
- Bandingkan dengan nilai terakhir yang disimpan.
Kode 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;
}Buka di kompilerSolusi dan penjelasan
Mulai dengan write = 1. Baca dari read = 1; jika arr[read] berbeda dari arr[write - 1], salin ke arr[write] dan tambah write.
Cetak write dan bagian awal array sepanjang itu. Waktu O(N), memori tambahan O(1).
Kode solusi
#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;
}Pertanyaan umum
Mengapa kode dan keluarannya tetap dalam bahasa Inggris?
Kata kunci, pengenal, dan teks yang diperiksa tes dipertahankan agar program tidak berubah. Penjelasan dan kontrol telah diterjemahkan.