python-leetcode-或运算的最小翻转次数

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

我们可以逐位检查 abc 的二进制表示,确定最少需要翻转多少个位才能满足 a | b == c。具体来说:

  • 如果 c 的当前位是 1,那么 ab 至少有一个该位必须是 1。如果它们都是 0,则需要翻转其中一个为 1
  • 如果 c 的当前位是 0,那么 ab 的该位都必须是 0,如果 ab 的该位是 1,则需要翻转这些 1 变成 0

我们可以使用按位运算来逐位检查 abc,计算所需的最小翻转次数。

下面是 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

这个方法逐位检查 abc,并计算最少需要的翻转次数,直到所有位都处理完。时间复杂度是 O(log N),其中 N 是最大的输入数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值