Online C Compiler
Buka di kompiler

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.

Buka di kompiler

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 kompiler
Solusi 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.