Rumah > pembangunan bahagian belakang > C++ > Bilangan minimum lilitan pasangan bukan bersebelahan diperlukan untuk mengalih keluar semua sifar dalam rentetan binari

Bilangan minimum lilitan pasangan bukan bersebelahan diperlukan untuk mengalih keluar semua sifar dalam rentetan binari

WBOY
Lepaskan: 2023-09-04 13:09:06
ke hadapan
728 orang telah melayarinya

Bilangan minimum lilitan pasangan bukan bersebelahan diperlukan untuk mengalih keluar semua sifar dalam rentetan binari

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.

Algoritma

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++.

Contoh

#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;
}
Salin selepas log masuk

Output

3
Salin selepas log masuk

Perihalan kod

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();
Salin selepas log masuk

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++;
      }
   }
}
Salin selepas log masuk

Akhir sekali, kami mengeluarkan kiraan lilitan pasangan bukan bersebelahan yang diperlukan untuk mengeluarkan semua 0 daripada rentetan.

cout << cnt << endl;
Salin selepas log masuk

Contoh kes ujian

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".

Kesimpulan

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!

Label berkaitan:
sumber:tutorialspoint.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan