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 asnum2
, 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; }