1318. 或运算的最小翻转次数 - 力扣(LeetCode)



我们可以逐位检查 a、b 和 c 的二进制表示,确定最少需要翻转多少个位才能满足 a | b == c。具体来说:
- 如果
c的当前位是1,那么a和b至少有一个该位必须是1。如果它们都是0,则需要翻转其中一个为1。 - 如果
c的当前位是0,那么a和b的该位都必须是0,如果a或b的该位是1,则需要翻转这些1变成0。
我们可以使用按位运算来逐位检查 a、b 和 c,计算所需的最小翻转次数。
下面是 Python 代码实现:
def minFlips(a: int, b: int, c: int) -> int:
flips = 0
while a > 0 or b > 0 or c > 0:
bit_a = a & 1
bit_b = b & 1
bit_c = c & 1
if bit_c == 0:
flips += bit_a + bit_b # 如果c的当前位是0,a和b的1都需要翻转
else:
if bit_a == 0 and bit_b == 0:
flips += 1 # 如果c的当前位是1,a和b至少有一个需要翻转为1
a >>= 1
b >>= 1
c >>= 1
return flips
这个方法逐位检查 a、b 和 c,并计算最少需要的翻转次数,直到所有位都处理完。时间复杂度是 O(log N),其中 N 是最大的输入数。
1224

被折叠的 条评论
为什么被折叠?



