2429。最小化异或
难度:中等
主题:贪婪、位操作
此问题要求您找到一个正整数 x,它满足两个条件:它具有与给定整数 num2
相同数量的设置位(二进制表示形式为 1),其与另一个给定整数 num1
的按位异或被最小化。
示例1:
num1
= 3,num2
= 5示例2:
num1
= 1,num2
= 12约束:
num1
,num2
≤ 109
解决方法:
关键是贪婪策略。 为了最小化 XOR 结果,我们希望将 x 的设置位与 num1
的设置位尽可能对齐。
计算设置位:确定num2
中设置位的数量。我们称之为targetBits
。
构造 x: 将 x 初始化为 0。从最高有效位开始迭代 num1
的各个位。 对于 num1
中的每个设置位,如果我们尚未达到 targetBits
,则将该位添加到 x。 如果我们已经满足 targetBits
要求,请跳过该位。 如果我们在处理完 targetBits
的所有位后还没有达到 num1
,则从最低有效位开始将剩余位添加到 x。
返回x:构造的x将满足条件。
PHP 实现:
<code class="language-php"><?php function minimizeXor(int $num1, int $num2): int { $targetBits = countSetBits($num2); $x = 0; $bitsSet = 0; for ($i = 30; $i >= 0; $i--) { if (($num1 >> $i) & 1) { // Check if the i-th bit of num1 is set if ($bitsSet < $targetBits) { $x |= (1 << $i); // Set the i-th bit of x $bitsSet++; } } } // If we haven't reached targetBits, add remaining bits from LSB for ($i = 0; $i < 31 && $bitsSet < $targetBits; $i++) { if (!($x & (1 << $i))) { //check if bit is not set yet $x |= (1 << $i); $bitsSet++; } } return $x; } function countSetBits(int $n): int { $count = 0; while ($n > 0) { $count += $n & 1; $n >>= 1; } return $count; } // Test cases echo minimizeXor(3, 5) . PHP_EOL; // Output: 3 echo minimizeXor(1, 12) . PHP_EOL; // Output: 3 echo minimizeXor(10, 7) . PHP_EOL; //Output: 11 ?></code>
时间和空间复杂度:
num1
和 num2
的最大值。 这是因为我们迭代数字的位。这个改进的解决方案提供了一种更清晰、更高效、更稳健的方法来解决问题。 注释解释了每一步的逻辑。
以上是最小化异或的详细内容。更多信息请关注PHP中文网其他相关文章!