Maison > Article > développement back-end > Nombre minimum de retournements de paires non adjacentes requis pour supprimer tous les zéros dans une chaîne binaire
Dans une chaîne binaire, retourner une paire de bits adjacents peut facilement supprimer un seul 0 de la chaîne. Cependant, lorsque nous devons supprimer tous les 0 d’une chaîne binaire, nous devrons peut-être également inverser des paires de bits non adjacentes. Dans cet article, nous verrons comment déterminer le nombre minimum de retournements de paires non adjacentes requis pour supprimer tous les 0 d'une chaîne binaire.
Pour résoudre ce problème, nous utiliserons un algorithme glouton simple. L’idée est de toujours choisir la paire de bits les plus éloignés les uns des autres et avoir au moins un 0 entre les deux. Nous pouvons ensuite inverser ces deux bits, supprimant ainsi un 0 de la chaîne. Nous répétons ce processus jusqu'à ce que tous les 0 aient été supprimés.
Implémentons maintenant cet algorithme en 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
Le code ci-dessus prend une chaîne binaire en entrée et calcule le nombre minimum de retournements de paires non adjacentes requis pour supprimer tous les 0 de la chaîne. Examinons maintenant le code en détail.
Tout d'abord, nous prenons une chaîne binaire en entrée et la stockons dans la variable chaîne "s". Nous stockons également la taille de la chaîne dans une variable entière "n".
string s; cin >> s; int n = s.size();
Ensuite, nous initialisons la variable « cnt » pour stocker le nombre de 0 dans la chaîne. Nous parcourons ensuite la chaîne en utilisant une boucle for. Pour chaque 0 rencontré, nous incrémentons le nombre de 0 et vérifions si les deux bits suivants sont également des 0. Si c’est le cas, on retourne la paire de bits en augmentant l’index de 2. Sinon, nous retournons uniquement les paires de bits adjacentes en augmentant l'index de 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++; } } }
Enfin, nous affichons le nombre de retournements de paires non adjacents requis pour supprimer tous les 0 de la chaîne.
cout << cnt << endl;
Considérons la chaîne binaire "100101000". Le nombre minimum de retournements de paires non adjacentes requis pour supprimer tous les 0 de cette chaîne peut être calculé à l'aide de l'algorithme ci-dessus.
Tout d’abord, nous rencontrons 0 en position 2. Nous retournons la paire (1,3) pour obtenir la chaîne "110101000". Ensuite, nous rencontrons le prochain 0 en position 5. Nous retournons la paire (1,7) pour obtenir la chaîne "111101000". Ensuite, nous rencontrons le prochain 0 en position 8. Nous retournons la paire (1,9) pour obtenir la chaîne "111111000". Désormais, tous les 0 ont été supprimés de la chaîne.
Le nombre de retournements de paires non adjacents requis pour supprimer tous les 0 d’une chaîne est de 3. Nous pouvons le vérifier en exécutant le code C++ ci-dessus sur la chaîne d'entrée "100101000".
Dans cet article, nous avons expliqué comment déterminer le nombre minimum de retournements de paires non adjacentes requis pour supprimer tous les 0 d'une chaîne binaire. Nous utilisons un algorithme glouton simple pour résoudre ce problème et l'implémentons dans le code C++. Nous fournissons également un exemple de cas de test pour illustrer le fonctionnement de l'algorithme.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!