Dado un número binario en forma de string, la tarea es imprimir un equivalente binario obtenido al invertir solo un conjunto contiguo de 0 de modo que el equivalente decimal de este número binario sea el máximo.
Nota: No suponga ningún cero final al comienzo del número binario, es decir, «0101» se da como «101».
Ejemplos:
Entrada: s = “10101”
Salida: 11101
Explicación:
Aquí solo podemos voltear el segundo carácter de la string “10101” (= 21) que lo cambiará a “11101” (= 29). Dado que se nos permite voltear un subarreglo continuo, cualquier volteo adicional conducirá a una disminución en el equivalente decimal.
Entrada: s = “1000”
Salida: 1111
Explicación:
Si volteamos los caracteres continuos desde la posición 1 hasta la 3, obtendremos 1111, que es el número máximo posible en 4 bits, es decir, 15.
Planteamiento: Para resolver el problema mencionado anteriormente sabemos que tenemos que aumentar el valor del equivalente binario. Por lo tanto, debemos aumentar el número de 1 en la posición más alta . Claramente, podemos aumentar el valor del número simplemente volteando los ceros que aparecen inicialmente. Recorra la string y voltee la primera aparición de ceros hasta que ocurra un 1, en este caso, el ciclo debe romperse. Imprime la string resultante.
A continuación se muestra la implementación del enfoque anterior:
C++
// C++ implementation to Maximize the value of // the decimal equivalent given in the binary form #include <bits/stdc++.h> using namespace std; // Function to print the binary number void flip(string& s) { for (int i = 0; i < s.length(); i++) { // Check if the current number is 0 if (s[i] == '0') { // Find the continuous 0s while (s[i] == '0') { // Replace initially // occurring 0 with 1 s[i] = '1'; i++; } // Break out of loop if 1 occurs break; } } } // Driver code int main() { string s = "100010001"; flip(s); cout << s; return 0; }
Java
// Java implementation to maximize the value of // the decimal equivalent given in the binary form import java.util.*; class GFG{ // Function to print the binary number static void flip(String s) { StringBuilder sb = new StringBuilder(s); for(int i = 0; i < sb.length(); i++) { // Check if the current number is 0 if (sb.charAt(i) == '0') { // Find the continuous 0s while (sb.charAt(i) == '0') { // Replace initially // occurring 0 with 1 sb.setCharAt(i, '1'); i++; } // Break out of loop if 1 occurs break; } } System.out.println(sb.toString()); } // Driver code public static void main(String[] args) { String s = "100010001"; flip(s); } } // This code is contributed by offbeat
Python3
# Python3 implementation to # Maximize the value of the # decimal equivalent given # in the binary form # Function to print the binary # number def flip(s): s = list(s) for i in range(len(s)): # Check if the current number # is 0 if(s[i] == '0'): # Find the continuous 0s while(s[i] == '0'): # Replace initially # occurring 0 with 1 s[i] = '1' i += 1 s = ''.join(map(str, s)) # return the string and # break the loop return s # Driver code s = "100010001" print(flip(s)) # This code is contributed by avanitrachhadiya2155
C#
// C# implementation to maximize the value of // the decimal equivalent given in the binary form using System; class GFG{ // Function to print the binary number static String flip(char []s) { for(int i = 0; i < s.Length; i++) { // Check if the current number is 0 if (s[i] == '0') { // Find the continuous 0s while (s[i] == '0') { // Replace initially // occurring 0 with 1 s[i] = '1'; i++; } // Break out of loop if 1 occurs break; } } return new String(s); } // Driver code public static void Main(String[] args) { String s = "100010001"; Console.WriteLine(flip(s.ToCharArray())); } } // This code is contributed by Rohit_ranjan
Javascript
<script> // JavaScript implementation to maximize the value of // the decimal equivalent given in the binary form // Function to print the binary number function flip(s) { for(let i = 0; i < s.length; i++) { // Check if the current number is 0 if (s[i] == '0') { // Find the continuous 0s while (s[i] == '0') { // Replace initially // occurring 0 with 1 s[i] = '1'; i++; } // Break out of loop if 1 occurs break; } } return s.join(""); } let s = "100010001"; document.write(flip(s.split(''))); </script>
111110001
Complejidad de tiempo: O(|s|)
Espacio Auxiliar: O(1)