Dalam rentetan binari, membalikkan sepasang bit bersebelahan boleh mengeluarkan satu 0 daripada rentetan dengan mudah. Walau bagaimanapun, apabila kita perlu mengalih keluar semua 0 daripada rentetan binari, kita juga mungkin perlu membalikkan pasangan bit bukan bersebelahan. Dalam artikel ini, kita akan membincangkan cara untuk menentukan bilangan minimum lilitan pasangan bukan bersebelahan yang diperlukan untuk mengalih keluar semua 0 daripada rentetan binari.
Untuk menyelesaikan masalah ini, kami akan menggunakan algoritma tamak yang mudah. Ideanya adalah untuk sentiasa memilih pasangan bit yang paling jauh antara satu sama lain dan mempunyai sekurang-kurangnya satu 0 di antara. Kita kemudian boleh membalikkan dua bit ini, dengan berkesan mengeluarkan 0 daripada rentetan. Kami mengulangi proses ini sehingga semua 0 telah dialih keluar.
Sekarang mari kita laksanakan algoritma ini dalam C++.
#include <iostream> #include <cstring> using namespace std; int main() { string s; s="100101000"; int n = s.size(); int cnt = 0; for (int i = 0; i < n; i++) { if (s[i] == '0') { cnt++; if (i+2 < n && s[i+2] == '0') { i += 2; } else { i++; } } } cout << cnt << endl; return 0; }
3
Kod di atas mengambil rentetan binari sebagai input dan mengira bilangan minimum lambungan pasangan bukan bersebelahan yang diperlukan untuk mengalih keluar semua 0 daripada rentetan. Sekarang mari kita lihat kod secara terperinci.
Pertama, kami mengambil rentetan binari sebagai input dan menyimpannya dalam pembolehubah rentetan "s". Kami juga menyimpan saiz rentetan dalam pembolehubah integer "n".
string s; cin >> s; int n = s.size();
Seterusnya, kami memulakan pembolehubah "cnt" untuk menyimpan nombor 0 dalam rentetan. Kami kemudian mengulangi rentetan menggunakan gelung for. Untuk setiap 0 yang ditemui, kami menambah kiraan 0s dan menyemak sama ada dua bit seterusnya juga 0s. Jika ya, kami membalikkan pasangan bit dengan meningkatkan indeks sebanyak 2. Jika tidak, kami hanya membalikkan pasangan bit bersebelahan dengan meningkatkan indeks sebanyak 1.
int cnt = 0; for (int i = 0; i < n; i++) { if (s[i] == '0') { cnt++; if (i+2 < n && s[i+2] == '0') { i += 2; } else { i++; } } }
Akhir sekali, kami mengeluarkan kiraan lilitan pasangan bukan bersebelahan yang diperlukan untuk mengeluarkan semua 0 daripada rentetan.
cout << cnt << endl;
Mari kita pertimbangkan rentetan binari "100101000". Bilangan minimum lilitan pasangan bukan bersebelahan yang diperlukan untuk mengalih keluar semua 0 daripada rentetan ini boleh dikira menggunakan algoritma di atas.
Pertama, kita menghadapi 0 pada kedudukan 2. Kami membalikkan pasangan (1,3) untuk mendapatkan rentetan "110101000". Kemudian kita menghadapi 0 seterusnya pada kedudukan 5. Kami membalikkan pasangan (1,7) untuk mendapatkan rentetan "111101000". Kemudian kita menghadapi 0 seterusnya pada kedudukan 8. Kami membalikkan pasangan (1,9) untuk mendapatkan rentetan "111111000". Sekarang semua 0 telah dialih keluar daripada rentetan.
Bilangan lilitan pasangan bukan bersebelahan yang diperlukan untuk mengeluarkan semua 0 daripada rentetan ialah 3. Kita boleh mengesahkan ini dengan menjalankan kod C++ di atas pada rentetan input "100101000".
Dalam artikel ini, kami membincangkan cara menentukan bilangan minimum lilitan pasangan bukan bersebelahan yang diperlukan untuk mengalih keluar semua 0 daripada rentetan binari. Kami menggunakan algoritma tamak mudah untuk menyelesaikan masalah ini dan melaksanakannya dalam kod C++. Kami juga menyediakan contoh kes ujian untuk menggambarkan cara algoritma berfungsi.
Atas ialah kandungan terperinci Bilangan minimum lilitan pasangan bukan bersebelahan diperlukan untuk mengalih keluar semua sifar dalam rentetan binari. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!