【LeetCode75】第六十九题 或运算的最小翻转次数

目录

题目:

示例:

分析:

代码:


题目:

示例:

分析:

题目给我们 a,b,c 三个数,我们可以对 a 和 b 的二进制形态中的任何一位做翻转,问我们最少翻转几次之后可以让 a 位或 b 等于 c 。

这道题我们直接模拟即可。

首先我们知道 1 | 0 或者  1 | 1 或者 0 | 1 等于1 。只有 0 | 0的时候才等于0。

我们从三个数的右边开始判断,我们先单独提取出每个数的二进制形态下的最右边的数。

如果 c 为 1 ,那么 a 和 b 至少得有一个1,我们就判断,如果 a 和 b 都为0的情况下我们将翻转数加1。

而如果c为 0,那么 a 和 b 必须都为0,所以 a 和 b 每有一个1,我们的翻转数都必须加1。

每轮判断完之后,我们都需要将三个数都右移一位,以此来检测每一位。因为 a,b,c 为 int 类型,所以每个数都是32位,因此我们上述操作需要重复32次,放到一个 for 循环里执行。

最终把翻转数返回出去即可。

代码:

class Solution {
public:
    int minFlips(int a, int b, int c) {
        int res=0;
        int bita,bitb,bitc;
        for(int i=0;i<32;i++){
            bita=a&1;bitb=b&1;bitc=c&1;
            if(bitc==1){
                if(bita==0&&bitb==0) res++;
            }else{
                if(bita==1) res++;
                if(bitb==1) res++;
            }
            a>>=1;b>>=1;c>>=1;
        }
        return res;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值