Given an integer N, the task is to find the greatest number that can be obtained by flipping at most K bits in the binary representation of N.
Examples:
Input: N = 4, K = 1
Output: 6
The binary equivalent of 4 is 100.
On flipping the 1st 0, we get 110
which is equivalent to 6.
Input: N = 5, K = 2
Output: 7
Approach:
- If the number of 0s in the binary representation of N is less than K then flip all the 0s.
- If the number of 0s is greater than or equal to K then flip the most significant K 0s.
- Finally, print the maximized integer.
Below is the implementation of the above approach:
C++
// C++ implementation of the approach #include <bits/stdc++.h> using namespace std; // Function to convert decimal number n // to its binary representation // stored as an array arr[] void decBinary( int arr[], int n) { int k = log2(n); while (n > 0) { arr[k--] = n % 2; n /= 2; } } // Function to convert the number // represented as a binary array // arr[] into its decimal equivalent int binaryDec( int arr[], int n) { int ans = 0; for ( int i = 0; i < n; i++) ans += arr[i] << (n - i - 1); return ans; } // Function to return the maximized // number by flipping atmost k bits int maxNum( int n, int k) { // Number of bits in n int l = log2(n) + 1; // Find the binary representation of n int a[l] = { 0 }; decBinary(a, n); // To count the number of 0s flipped int cn = 0; for ( int i = 0; i < l; i++) { if (a[i] == 0 && cn < k) { a[i] = 1; cn++; } } // Return the decimal equivalent // of the maximized number return binaryDec(a, l); } // Driver code int main() { int n = 4, k = 1; cout << maxNum(n, k); return 0; } |
Java
// Java implementation of the approach class GFG { // Function to convert decimal number n // to its binary representation // stored as an array arr[] static void decBinary( int arr[], int n) { int k = ( int )(Math.log(n) / Math.log( 2 )); while (n > 0 ) { arr[k--] = n % 2 ; n /= 2 ; } } // Function to convert the number // represented as a binary array // arr[] into its decimal equivalent static int binaryDec( int arr[], int n) { int ans = 0 ; for ( int i = 0 ; i < n; i++) ans += arr[i] << (n - i - 1 ); return ans; } // Function to return the maximized // number by flipping atmost k bits static int maxNum( int n, int k) { // Number of bits in n int l = ( int )(Math.log(n) / Math.log( 2 )) + 1 ; // Find the binary representation of n int a[] = new int [l]; decBinary(a, n); // To count the number of 0s flipped int cn = 0 ; for ( int i = 0 ; i < l; i++) { if (a[i] == 0 && cn < k) { a[i] = 1 ; cn++; } } // Return the decimal equivalent // of the maximized number return binaryDec(a, l); } // Driver code public static void main (String[] args) { int n = 4 , k = 1 ; System.out.println(maxNum(n, k)); } } // This code is contributed by AnkitRai01 |
Python3
# Python implementation of the approach import math # Function to convert decimal number n # to its binary representation # stored as an array arr[] def decBinary(arr, n): k = int (math.log2(n)) while (n > 0 ): arr[k] = n % 2 k = k - 1 n = n / / 2 # Function to convert the number # represented as a binary array # arr[] into its decimal equivalent def binaryDec(arr, n): ans = 0 for i in range ( 0 , n): ans = ans + (arr[i] << (n - i - 1 )) return ans # Function to return the maximized # number by flipping atmost k bits def maxNum(n, k): # Number of bits in n l = int (math.log2(n)) + 1 # Find the binary representation of n a = [ 0 for i in range ( 0 , l)] decBinary(a, n) # To count the number of 0s flipped cn = 0 for i in range ( 0 , l): if (a[i] = = 0 and cn < k): a[i] = 1 cn = cn + 1 # Return the decimal equivalent # of the maximized number return binaryDec(a, l) # Driver code n = 4 k = 1 print (maxNum(n, k)) # This code is contributed by Sanjit_Prasad |
C#
// C# implementation of the approach using System; class GFG { // Function to convert decimal number n // to its binary representation // stored as an array []arr static void decBinary( int []arr, int n) { int k = ( int )(Math.Log(n) / Math.Log(2)); while (n > 0) { arr[k--] = n % 2; n /= 2; } } // Function to convert the number // represented as a binary array // []arr into its decimal equivalent static int binaryDec( int []arr, int n) { int ans = 0; for ( int i = 0; i < n; i++) ans += arr[i] << (n - i - 1); return ans; } // Function to return the maximized // number by flipping atmost k bits static int maxNum( int n, int k) { // Number of bits in n int l = ( int )(Math.Log(n) / Math.Log(2)) + 1; // Find the binary representation of n int []a = new int [l]; decBinary(a, n); // To count the number of 0s flipped int cn = 0; for ( int i = 0; i < l; i++) { if (a[i] == 0 && cn < k) { a[i] = 1; cn++; } } // Return the decimal equivalent // of the maximized number return binaryDec(a, l); } // Driver code public static void Main(String[] args) { int n = 4, k = 1; Console.WriteLine(maxNum(n, k)); } } // This code is contributed by Rajput-Ji |
Javascript
<script> // Javascript implementation of the approach // Function to convert decimal number n // to its binary representation // stored as an array arr[] function decBinary(arr, n) { let k = Math.log2(n); while (n > 0) { arr[k--] = n % 2; n = Math.floor(n / 2); } } // Function to convert the number // represented as a binary array // arr[] into its decimal equivalent function binaryDec(arr, n) { let ans = 0; for (let i = 0; i < n; i++) ans += arr[i] << (n - i - 1); return ans; } // Function to return the maximized // number by flipping atmost k bits function maxNum(n, k) { // Number of bits in n let l = Math.log2(n) + 1; // Find the binary representation of n let a = new Array(l).fill(0); decBinary(a, n); // To count the number of 0s flipped let cn = 0; for (let i = 0; i < l; i++) { if (a[i] == 0 && cn < k) { a[i] = 1; cn++; } } // Return the decimal equivalent // of the maximized number return binaryDec(a, l); } // Driver code let n = 4, k = 1; document.write(maxNum(n, k)); // This code is contributed by _saurabh_jaiswal. </script> |
6
Time Complexity: O(log2n)
Auxiliary Space: O(log2n)
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 neveropen!