Leetcode 1318:或运算的最小翻转次数(超详细的解法!!!)

给你三个正整数 abc

你可以对 ab 的二进制表示进行位翻转操作,返回能够使按位或运算 a OR b == c 成立的最小翻转次数。

「位翻转操作」是指将一个数的二进制表示任何单个位上的 1 变成 0 或者 0 变成 1 。

示例 1:

输入:a = 2, b = 6, c = 5
输出:3
解释:翻转后 a = 1 , b = 4 , c = 5 使得 a OR b == c

示例 2:

输入:a = 4, b = 2, c = 7
输出:1

示例 3:

输入:a = 1, b = 2, c = 3
输出:0

提示:

  • 1 <= a <= 10^9
  • 1 <= b <= 10^9
  • 1 <= c <= 10^9

解题思路

很明显这个问题需要通过位运算来处理,首先你需要知道1|1=11|0=10|0=0。接着观察一下第一个例子:

a: 010
b: 110
c: 101

我们可以针对c的每一位做调整,如果当前位是1,此时我们需要判断ab的当前为是不是1,如果是的话,那么不用翻转,否则我们需要翻转一次(ab都可以);如果c的当前位是0,那么我们需要判断ab的当前位是不是1,如果是的话,那么都要翻转。

class Solution:
    def minFlips(self, a: int, b: int, c: int) -> int:
        res = 0
        while c or a or b:
            if c & 1:
                res += 0 if (a & 1) or (b & 1) else 1
            else:
                res += (a & 1) + (b & 1)
            c >>= 1
            a >>= 1
            b >>= 1
        return res

我将该问题的其他语言版本添加到了我的GitHub Leetcode

如有问题,希望大家指出!!!

发布了708 篇原创文章 · 获赞 445 · 访问量 81万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 技术黑板 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览