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 是最大的输入数。