Minimum given operations required to convert a given binary string to all 1’s
Given a binary number as a string str of length L. The task is to find the minimum number of operations needed so that the number becomes 2L-1, that is a string consisting of only 1’s of the length L.
In each operation, the number N can be replaced by N xor (N + 1).
Examples:
Input: str = “10010111”
Output: 5
N = 10010111, N + 1 = 10011000, so N xor (N + 1) = 00001111
N = 00001111, N + 1 = 00010000, so N xor (N + 1) = 00011111
N = 00011111, N + 1 = 00100000, so N xor (N + 1) = 00111111
N = 00111111, N + 1 = 01000000, so N xor (N + 1) = 01111111
N = 01111111, N + 1 = 10000000, so N xor (N + 1) = 11111111
Input: str = “101000100101011101”
Output: 17
Approach: After performing the given operation, it can be observed that in order to get the required number, in the end, the number of operations will be:
Number of Operations = length of the string (after removing leading 0s) – count of consecutive 1’s form the end (starting from the least significant bit)
Below is the implementation of the above approach:
C++
#include <bits/stdc++.h>
using namespace std;
int changeToOnes(string str)
{
int i, l, ctr = 0;
l = str.length();
for (i = l - 1; i >= 0; i--) {
if (str[i] == '1' )
ctr++;
else
break ;
}
return l - ctr;
}
string removeZeroesFromFront(string str)
{
string s;
int i = 0;
while (i < str.length() && str[i] == '0' )
i++;
if (i == str.length())
s = "0" ;
else
s = str.substr(i, str.length() - i);
return s;
}
int main()
{
string str = "10010111" ;
str = removeZeroesFromFront(str);
cout << changeToOnes(str);
return 0;
}
|
Java
class GFG
{
static int changeToOnes(String str)
{
int i, l, ctr = 0 ;
l = str.length();
for (i = l - 1 ; i >= 0 ; i--)
{
if (str.charAt(i) == '1' )
ctr++;
else
break ;
}
return l - ctr;
}
static String removeZeroesFromFront(String str)
{
String s;
int i = 0 ;
while (i < str.length() &&
str.charAt(i) == '0' )
i++;
if (i == str.length())
s = "0" ;
else
s = str.substring(i, str.length() - i);
return s;
}
public static void main(String[] args)
{
String str = "10010111" ;
str = removeZeroesFromFront(str);
System.out.println(changeToOnes(str));
}
}
|
Python3
def changeToOnes(string) :
ctr = 0 ;
l = len (string);
for i in range (l - 1 , - 1 , - 1 ) :
if (string[i] = = '1' ) :
ctr + = 1 ;
else :
break ;
return l - ctr;
def removeZeroesFromFront(string) :
s = "";
i = 0 ;
while (i < len (string) and
string[i] = = '0' ) :
i + = 1 ;
if (i = = len (string)) :
s = "0" ;
else :
s = string[i: len (string) - i];
return s;
if __name__ = = "__main__" :
string = "10010111" ;
string = removeZeroesFromFront(string);
print (changeToOnes(string));
|
C#
using System;
class GFG
{
static int changeToOnes(String str)
{
int i, l, ctr = 0;
l = str.Length;
for (i = l - 1; i >= 0; i--)
{
if (str[i] == '1' )
ctr++;
else
break ;
}
return l - ctr;
}
static String removeZeroesFromFront(String str)
{
String s;
int i = 0;
while (i < str.Length &&
str[i] == '0' )
i++;
if (i == str.Length)
s = "0" ;
else
s = str.Substring(i, str.Length - i);
return s;
}
public static void Main(String[] args)
{
String str = "10010111" ;
str = removeZeroesFromFront(str);
Console.WriteLine(changeToOnes(str));
}
}
|
Javascript
<script>
function changeToOnes(str)
{
var i, l, ctr = 0;
l = str.length;
for (i = l - 1; i >= 0; i--) {
if (str[i] == '1' )
ctr++;
else
break ;
}
return l - ctr;
}
function removeZeroesFromFront(str)
{
var s;
var i = 0;
while (i < str.length && str[i] == '0 ')
i++;
// If we reach the end of
// the string, it means that
// string contains only 0' s
if (i == str.length)
s = "0" ;
else
s = str.substring(i, str.length - i);
return s;
}
var str = "10010111" ;
str = removeZeroesFromFront(str);
document.write( changeToOnes(str));
</script>
|
Time Complexity: O(n), where n is the length of the given string.
Auxiliary Space: O(n)
Last Updated :
22 Dec, 2022
Like Article
Save Article
Share your thoughts in the comments
Please Login to comment...