Find the Complement of Base 10 Integer in Java


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:

  1. 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:

  1. Converting the int to binary
  2. Creating a new int array of the same length, but with all zeroed values
  3. Look from right to left and swap the values
  4. Create a new string and loop through the array appending them
  5. Convert the resulting string binary back to an int
  6. 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;
        
    }
}