Saya sedang menyelesaikan latihan yang berjalan sebagai berikut:

Buat fungsi dengan prototipe berikut int commons(int a[], int na, int b[], int nb) yang mengembalikan berapa banyak angka yang dimiliki larik a (dengan ukuran na) dengan larik b ( ukuran nb). Array tidak dipesan.

Latihan ini tidak mengatakan apa yang seharusnya terjadi ketika ada lebih dari satu angka yang sama tetapi untuk saya ingin menganggap bahwa jika ada array a = { 1, 2, 2 } dan array b = { 2, 0, 5} mereka hanya memiliki satu elemen kesamaan yaitu 2 (terjadi satu kali).

Untuk mengatasi ini, saya memutuskan untuk mengulang setiap nomor dari array pertama dan memeriksa apakah itu milik yang kedua, jika ya, saya akan mendapatkan posisi dan menggeser array kedua untuk "menghapusnya" dari array. Namun saya harus melakukan beberapa penyesuaian, karena setelah saya menggesernya, item terakhir akan diulang sehingga saya memilih untuk mengurangi variabel len. Namun saya mendapatkan hasil yang tidak terduga. Situs web tempat saya menguji

int index_occur(int x, int a[], int N) {
    int i;
    for (i = 0; i < N && a[i] != x; i++); 
    return (i == N ? -1 : i);
}

int common(int a[], int na, int b[], int nb) { 
    int i, c = 0, j, index;
    int len = nb; 
    for (i = 0; i < na; i++) {
       if ((index = index_occur(a[i], b, len)) != -1) { 
            for (j = index; j < nb - 1; j++)
                b[j] = b[j + 1]; 
            len--; 
            c++;
        } 
    } 
    return c;
}

Ketika saya menguji di situs web dengan array berikut, inilah yang saya dapatkan:

Masukan: [ 1 12 13 14 5 16 17 18 19 110 111 12 113 114 115 116 117 18 119 12 ]

[ 2 3 4 1 20 21 22 23 5 126 127 129 132 132 132 132 132 132 132 132 ]

Output: diharapkan 2 diperoleh 7

Saya tidak mengerti apa yang salah dengan kode saya, karena tidak menghasilkan hasil yang diinginkan.

0
user13024289 7 Maret 2020, 19:33

1 menjawab

Jawaban Terbaik

Pasti ada yang salah dalam kode pengujian Anda. Saya menjalankan fungsi Anda dengan array yang diposting dan saya mendapatkan hasil yang diharapkan 2.

Kode Anda tampaknya berfungsi, tetapi ada beberapa komentar:

  • loop dalam Anda harus berhenti di len - 1, bukan nb - 1.
  • Anda memodifikasi larik b dan secara efektif menghancurkan isinya. Anda mungkin ingin memindahkan elemen yang ditemukan ke akhir sehingga array hanya dikocok tetapi masih berisi angka yang sama.
  • Jika Anda akan memodifikasi array, Anda sebaiknya mengurutkannya dan menggunakan pemindaian linier untuk menghitung elemen yang sama.

Berikut adalah alternatif yang tidak mengubah array:

int count_occurrences(int x, const int a[], int n) {
    int count = 0, i;
    for (i = 0; i < n; i++) {
        if (a[i] == x)
            count++;
    }
    return count;
}

int common(const int a[], int na, const int b[], int nb) {
    int i, count = 0;
    for (i = 0; i < na; i++) {
        int n = count_occurrences(a[i], b, nb);
        if (n > 0 && n > count_occurrences(a[i], a, i - 1))
            count++;
    }
    return count;
}
0
chqrlie 7 Maret 2020, 18:05