最小异或
难度:
标签:
题目描述
代码结果
运行时间: 23 ms, 内存: 16.0 MB
/*
* 题目思路:
* 1. 找出num2中二进制表示中1的个数(即置位数)。
* 2. 创建一个新的数x,使其二进制表示中1的个数与num2相同。
* 3. 使得x XOR num1的结果最小。为了达到这个目的,我们需要尽可能让x与num1相同。
*/
import java.util.stream.IntStream;
public class Solution {
public int minimizeXor(int num1, int num2) {
int countOnes = Integer.bitCount(num2); // 获取num2中1的个数
int[] result = {0};
int[] count = {countOnes};
// 将num1的位从高到低遍历,尽可能将num1的1位保留
IntStream.range(0, 32).map(i -> 31 - i).filter(i -> (num1 & (1 << i)) != 0).forEach(i -> {
if (count[0] > 0) {
result[0] |= (1 << i);
count[0]--;
}
});
// 如果还没有达到需要的1的个数,则从低位开始补1
IntStream.range(0, 32).filter(i -> (result[0] & (1 << i)) == 0).forEach(i -> {
if (count[0] > 0) {
result[0] |= (1 << i);
count[0]--;
}
});
return result[0];
}
}
解释
方法:
该题解的核心思路是调整 num1 的二进制表示,使其包含的 1 的个数与 num2 相同,同时保持其值尽可能小。首先,计算 num1 和 num2 的二进制表示中 1 的个数(置位数),分别为 c1 和 c2。如果 num1 的置位数多于 num2(c1 > c2),则通过将 num1 与 (num1 - 1) 进行按位与操作去除最低位的 1 直到两者的置位数一致。如果 num1 的置位数少于 num2(c1 < c2),则通过将 num1 与 (num1 + 1) 进行按位或操作添加最低位的 0 直到置位数一致。这种方法保证了 num1 调整后的值是最小的符合条件的值。
时间复杂度:
O(b)
空间复杂度:
O(1)
代码细节讲解
🦆
题解中提到,通过将num1与(num1 - 1)进行按位与操作去除最低位的1,为什么这样的操作可以保证去掉的是最低位的1?
▷🦆
在增加置位数的过程中,为什么选择将num1与(num1 + 1)进行按位或操作,这样的操作是否总是能正确地只添加一个1位?
▷🦆
题解中提到,这种方法可以保证调整后的num1是最小的符合条件的值。如何理解这个“最小”是如何被保证的?
▷