首页 >后端开发 >php教程 >最小化异或

最小化异或

Susan Sarandon
Susan Sarandon原创
2025-01-16 11:32:58226浏览

Minimize XOR

2429。最小化异或

难度:中等

主题:贪婪、位操作

此问题要求您找到一个正整数 x,它满足两个条件:它具有与给定整数 num2 相同数量的设置位(二进制表示形式为 1),其与另一个给定整数 num1 的按位异或被最小化。

示例1:

  • 输入: num1 = 3,num2 = 5
  • 输出: 3
  • 解释:3 (0011) 和 5 (0101) 都有两个设置位。 3 XOR 3 = 0,这是可能的最小 XOR 值。

示例2:

  • 输入: num1 = 1,num2 = 12
  • 输出: 3
  • 解释: 12 (1100) 有两个设置位。 3(0011)也有两个设置位,3 XOR 1 = 2。

约束:

  • 1 ≤ num1num2 ≤ 109

解决方法:

关键是贪婪策略。 为了最小化 XOR 结果,我们希望将 x 的设置位与 num1 的设置位尽可能对齐。

  1. 计算设置位:确定num2中设置位的数量。我们称之为targetBits

  2. 构造 x:x 初始化为 0。从最高有效位开始迭代 num1 的各个位。 对于 num1 中的每个设置位,如果我们尚未达到 targetBits,则将该位添加到 x。 如果我们已经满足 targetBits 要求,请跳过该位。 如果我们在处理完 targetBits 的所有位后还没有达到 num1,则从最低有效位开始将剩余位添加到 x

  3. 返回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>

时间和空间复杂度:

  • 时间复杂度: O(log N),其中 N 是 num1num2 的最大值。 这是因为我们迭代数字的位。
  • 空间复杂度: O(1),使用恒定的额外空间。

这个改进的解决方案提供了一种更清晰、更高效、更稳健的方法来解决问题。 注释解释了每一步的逻辑。

以上是最小化异或的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn