The challenge
Every non-negative integer N
has a binary representation. For example, 5
can be represented as "101"
in binary, 11
as "1011"
in binary, and so on. Note that except for N = 0
, there are no leading zeroes in any binary representation.
The complement of a binary representation is the number in binary you get when changing every 1
to a and
to a 1
. For example, the complement of "101"
in binary is "010"
in binary.
For a given number N
in base-10, return the complement of it’s binary representation as a base-10 integer.
Example 1:
Input: 5 Output: 2 Explanation: 5 is "101" in binary, with complement "010" in binary, which is 2 in base-10.
Example 2:
Input: 7 Output: 0 Explanation: 7 is "111" in binary, with complement "000" in binary, which is 0 in base-10.
Example 3:
Input: 10 Output: 5 Explanation: 10 is "1010" in binary, with complement "0101" in binary, which is 5 in base-10.
Note:
0 <= N < 10^9
The solution in Java code
To solve this, we need to know how to convert an int to binary and back again.
In order to convert an int to binary, we can use the Integer.toBinaryString()
helper.
When we want to convert a binary string back to an int, we can use the Integer.parseInt(str, 2)
helper.
In the below code solution, we solve the problem by:
- Converting the int to binary
- Creating a new int array of the same length, but with all zeroed values
- Look from right to left and swap the values
- Create a new string and loop through the array appending them
- Convert the resulting string binary back to an int
- Return our answer
class Solution {
public int bitwiseComplement(int N) {
// convert int to binary
String bin = Integer.toBinaryString(N);
// create a new int array of variable length
int[] out = new int[bin.length()];
// fill the new array with zeroed values
Arrays.fill(out, 0);
// move through the array from right to left
for (int i=bin.length()-1; i>=0; i--) {
// if it's a 1, then swap to a 0, and vice versa
if (bin.charAt(i)=='1') out[i] = 0;
else out[i] = 1;
}
// create a new string
StringBuilder strNum = new StringBuilder();
// loop through the array and append to the string
for (int num : out) strNum.append(num);
// convert binary back to int
int finalInt = Integer.parseInt(strNum.toString(), 2);
// return our final answer
return finalInt;
}
}