首页 > 其他分享 >[LeetCode] 1318. Minimum Flips to Make a OR b Equal to c 或运算的最小翻转次数

[LeetCode] 1318. Minimum Flips to Make a OR b Equal to c 或运算的最小翻转次数

时间:2022-10-17 04:11:05浏览次数:76  
标签:int res Make Equal flips Flips https com 翻转


Given 3 positives numbers ab and c. Return the minimum flips required in some bits of a and b to make ( a OR b == c ). (bitwise OR operation).
Flip operation consists of change any single bit 1 to 0 or change the bit 0 to 1 in their binary representation.

Example 1:

Input: a = 2, b = 6, c = 5
Output: 3
Explanation: After flips a = 1 , b = 4 , c = 5 such that (`a` OR `b` == `c`)

Example 2:

Input: a = 4, b = 2, c = 7
Output: 1

Example 3:

Input: a = 1, b = 2, c = 3
Output: 0

Constraints:

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

这道题给了三个正整数a,b和c,现在说是可以翻转a和b的二进制数上的任意位,问最少需要翻转多少次就可以使得 a OR b 等于c。这题不算一道难题,主要就是要分析一下各种情况:

  • 当c为0的时候,a和b必须要都为0,才能或起来和c相等。所以只要a和b中有1的话都必须翻转,所以翻转的次数就就是 a+b(注意这里a,b,c 只看作一位数字)。

  • 当c为1的时候,则a和b中只要至少有一个是1就可以了,那么唯一需要翻转的情况就是当a和b同时为0的时候,这种情况可以通过计算 a OR b,若值为0,则说明a和b都是0,此时需要翻转一个。这里可以用 1 - (a | b) 这个式子来概括所有的情况。当a和b中至少有一个1的时候,a | b 值为1,则整个表达式值为0,表示不用翻转。

有了上面的分析之后,代码就很容易写了。因为要遍历整型数的每一位,则最多遍历 32 次就行了,对于每次遍历,通过 & 1 操作来取出最低位上的数字,然后通过上面的逻辑来计算需要翻转的个数加到结果 res 中,再分别对a,b和c右移一位,继续循环即可,参见代码如下:


class Solution {
public:
    int minFlips(int a, int b, int c) {
        int res = 0;
        for (int i = 0; i < 32; ++i) {
            int mc = c & 1, ma = a & 1, mb = b & 1;
            if (mc == 0) {
                res += ma + mb;
            } else {
                res += 1 - (ma | mb);
            }
            a >>= 1; b >>= 1; c >>= 1;
        }
        return res;
    }
};

Github 同步地址:

https://github.com/grandyang/leetcode/issues/1318


参考资料:

https://leetcode.com/problems/minimum-flips-to-make-a-or-b-equal-to-c/description/

https://leetcode.com/problems/minimum-flips-to-make-a-or-b-equal-to-c/solutions/479998/c-bitwise-xor-solution-1-line/

https://leetcode.com/problems/minimum-flips-to-make-a-or-b-equal-to-c/solutions/477690/java-python-3-bit-manipulation-w-explanation-and-analysis/


LeetCode All in One 题目讲解汇总(持续更新中...)

标签:int,res,Make,Equal,flips,Flips,https,com,翻转
From: https://www.cnblogs.com/grandyang/p/16797774.html

相关文章

  • opencv equalizeHist
    '''Whatarehistograms?HistogramsarecollectedcountsofdataorganizedintoasetofpredefinedbinsWhenwesaydatawearenotrestrictingittobeinte......
  • clone失败提示 Permission:denied (publickey). fatal: Could not read from remote r
     问题:克隆的时候有如下提示: 出现的场景:之前有一次github上边的全部SSH都给删除了,然后在此进行Clone的时候通过SSH进行不行。 解决办法:在电脑上重新生成秘钥,然......
  • Configure CMake Compile and Link Options with Generator Expression
    target_compile_options(${PROJECT_NAME}PRIVATE#EnableAllWarnings$<$<CXX_COMPILER_ID:MSVC>:/W4/sdl>$<$<CXX_COMPILER_ID:GNU>:-......
  • Ubuntu下安装make
    方法一:(自动安装)1、进入root权限:suroot2、更新安装列表:apt-getupdate3、安装make:apt-getinstallubuntu-make 方法二:(手动安装)1、查看make版本,在浏览器搜索:ftp://f......
  • Linux系统编程04-Makefile
    文件命名:makefile或Makefile规则:一个Makefile文件中可以有一个或多个规则目标...:依赖...​ 命令(shell命令)​ ...目标:最终生成的文件依赖:......
  • centos7 中 升级cmake
     001、(base)[root@pc1build]#cat/etc/redhat-release##系统CentOSLinuxrelease7.6.1810(Core)(base)[root@pc1build]#cmake--version##当前......
  • AtCoder Regular Contest 150 B Make Divisible 贪心 整除分块
    给出一个A和B想要找到一个X和Y使得\(A+X|B+Y\).同时使得X+Y最小求出X+Y的最小值。值域是\([1,10^9]\)直接枚举X不太行会被某种数据卡掉。考虑正解:先固定K另\(\frac{B......
  • new 和 make 函数区别
    详细参见go文件夹下src/builtin/builtin.go文件。 new函数定义:funcnew(Type)*Type说明:形参是一个数据类型,返回值是这个数据类型(零值)的的指针。用途:初始化,作用......
  • cmake aux_source_directory
    cmake中的aux_source_directory(.SRC_LIST):将当前文件的所有源文件放进变量SRC_LIST中。使用aux_source_directory的问题:当我们在当前目录下重新添加了新的源文件,但此时......
  • 【AI白身境】只会用Python?g++,CMake和Makefile了解一下
    今天是新专栏《AI白身境》的第六篇,所谓白身,就是什么都不会,还没有进入角色。对于大部分小白来说,因为python用的太爽,以致于或许都没有听说过CMake。python是脚本语言,而当前大......