Welcome to Subscribe On Youtube

2429. Minimize XOR

Description

Given two positive integers num1 and num2, find the positive integer x such that:

  • x has the same number of set bits as num2, and
  • The value x XOR num1 is minimal.

Note that XOR is the bitwise XOR operation.

Return the integer x. The test cases are generated such that x is uniquely determined.

The number of set bits of an integer is the number of 1's in its binary representation.

 

Example 1:

Input: num1 = 3, num2 = 5
Output: 3
Explanation:
The binary representations of num1 and num2 are 0011 and 0101, respectively.
The integer 3 has the same number of set bits as num2, and the value 3 XOR 3 = 0 is minimal.

Example 2:

Input: num1 = 1, num2 = 12
Output: 3
Explanation:
The binary representations of num1 and num2 are 0001 and 1100, respectively.
The integer 3 has the same number of set bits as num2, and the value 3 XOR 1 = 2 is minimal.

 

Constraints:

  • 1 <= num1, num2 <= 109

Solutions

Solution 1: Greedy + Bit Manipulation

According to the problem description, we first calculate the number of set bits $cnt$ in $num2$, then enumerate each bit of $num1$ from high to low. If the bit is $1$, we set the corresponding bit in $x$ to $1$ and decrement $cnt$ by $1$, until $cnt$ is $0$. If $cnt$ is still not $0$ at this point, we start from the low bit and set each bit of $num1$ that is $0$ to $1$, and decrement $cnt$ by $1$, until $cnt$ is $0$.

The time complexity is $O(\log n)$, and the space complexity is $O(1)$. Here, $n$ is the maximum value of $num1$ and $num2$.

  • class Solution {
        public int minimizeXor(int num1, int num2) {
            int cnt = Integer.bitCount(num2);
            int x = 0;
            for (int i = 30; i >= 0 && cnt > 0; --i) {
                if ((num1 >> i & 1) == 1) {
                    x |= 1 << i;
                    --cnt;
                }
            }
            for (int i = 0; cnt > 0; ++i) {
                if ((num1 >> i & 1) == 0) {
                    x |= 1 << i;
                    --cnt;
                }
            }
            return x;
        }
    }
    
  • class Solution {
    public:
        int minimizeXor(int num1, int num2) {
            int cnt = __builtin_popcount(num2);
            int x = 0;
            for (int i = 30; ~i && cnt; --i) {
                if (num1 >> i & 1) {
                    x |= 1 << i;
                    --cnt;
                }
            }
            for (int i = 0; cnt; ++i) {
                if (num1 >> i & 1 ^ 1) {
                    x |= 1 << i;
                    --cnt;
                }
            }
            return x;
        }
    };
    
  • class Solution:
        def minimizeXor(self, num1: int, num2: int) -> int:
            cnt = num2.bit_count()
            x = 0
            for i in range(30, -1, -1):
                if num1 >> i & 1 and cnt:
                    x |= 1 << i
                    cnt -= 1
            for i in range(30):
                if num1 >> i & 1 ^ 1 and cnt:
                    x |= 1 << i
                    cnt -= 1
            return x
    
    
  • func minimizeXor(num1 int, num2 int) int {
    	cnt := bits.OnesCount(uint(num2))
    	x := 0
    	for i := 30; i >= 0 && cnt > 0; i-- {
    		if num1>>i&1 == 1 {
    			x |= 1 << i
    			cnt--
    		}
    	}
    	for i := 0; cnt > 0; i++ {
    		if num1>>i&1 == 0 {
    			x |= 1 << i
    			cnt--
    		}
    	}
    	return x
    }
    
  • function minimizeXor(num1: number, num2: number): number {
        let cnt = 0;
        while (num2) {
            num2 &= num2 - 1;
            ++cnt;
        }
        let x = 0;
        for (let i = 30; i >= 0 && cnt > 0; --i) {
            if ((num1 >> i) & 1) {
                x |= 1 << i;
                --cnt;
            }
        }
        for (let i = 0; cnt > 0; ++i) {
            if (!((num1 >> i) & 1)) {
                x |= 1 << i;
                --cnt;
            }
        }
        return x;
    }
    
    

All Problems

All Solutions