Given a binary string S of a number N, the task is to find a number X such that we can minimize the value of N by changing N = N ??N/2X?, where 1 ? X ? |S| and ? denotes the bitwise XOR operation.
Examples:
Input: S = “110”
Output: 1
?Explanation: Since S = 110 is the binary representation of 6, N = 6.
On choosing X = 1, N becomes 6 ? ?6 / 21? = 5.
We can show that this is the minimum value of N we can achieveInput: S = ”10”
?Output: 2
Approach: The problem can be solved based on the following idea:
To minimize the value of N, we have to change the most significant bit (MSB) to 0. As X cannot be 0, this is not possible. So the most optimal is to change the second most significant set bit to 0. The set bit will become 0 when we XOR another number having a set bit at that position.
Say, the bit difference between MSB and second most significant set bit is K. So, for the second number N should be right shifted by K that is the same as dividing N by 2K. So optimal X = K. To get X
- Iterate a loop from second character to last character of string and count number of 0’s until 1 occur
- Whatever value we get, add one to get the number X such.
Follow the steps mentioned below to implement the above idea:
- Set count = 1.
- Iterate a for loop from 1 to S.length()-1 and check the ith character of a string such that:
- If ith character of a string is 0 then increment the value of count and whenever 1 occurs then break from the loop.
- After that print the value of count which is the number X such that we can minimize the value of N.
Below is the implementation of the above approach.
// C++ code to implement the approach #include <bits/stdc++.h> using namespace std;
// Function to find the value of X int findValue(string s, int len)
{ int count = 1;
for ( int i = 1; i < len; i++) {
if (s[i] == '0' )
count++;
else
break ;
}
return count;
} // Driver Code int main()
{ string S = "110" ;
int len = S.length();
// Function call
int X = findValue(S, len);
cout << X;
return 0;
} // This code is contributed by aarohirai2616. |
// Java code to implement the approach import java.io.*;
import java.util.*;
class GFG {
// Function to find the value of X
public static int findValue(String s, int len)
{
int count = 1 ;
for ( int i = 1 ; i < len; i++) {
if (s.charAt(i) == '0' )
count++;
else
break ;
}
return count;
}
// Driver code
public static void main(String[] args)
{
String S = "110" ;
int len = S.length();
// Function call
int X = findValue(S, len);
System.out.println(X);
}
} |
# Python code to implement the approach # Function to find the value of X def findValue(s, length):
count = 1
for i in range ( 1 , length):
if (s[i] = = '0' ):
count = count + 1
else :
break
return count
# Driver Code if __name__ = = '__main__' :
S = "110"
length = len (S)
# Function call
X = findValue(S, length)
print (X)
# This is contributed by aarohirai2616.
|
// C# code to implement the approach using System;
public class GFG {
// Function to find the value of X
public static int findValue(String s, int len)
{
int count = 1;
for ( int i = 1; i < len; i++) {
if (s[i] == '0' )
count++;
else
break ;
}
return count;
}
static public void Main()
{
// Code
String S = "110" ;
int len = S.Length;
// Function call
int X = findValue(S, len);
Console.WriteLine(X);
}
} // This code is contributed by lokeshmvs21. |
// Javascript code to implement the approach // Function to find the value of X function findValue(s, len) {
let count = 1;
for (let i = 1; i < len; i++) {
if (s[i] == '0' )
count++;
else
break ;
}
return count;
} // Driver code let S = "110" ;
let len = S.length; // Function call let X = findValue(S, len); document.write(X); // This code is contributed by saurabh_jaiswal. |
1
Time Complexity: O(|S|) where |S| is the length of the string
Auxiliary Space: O(1)