本文主要是介绍【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;}
};
这篇关于【LeetCode75】第六十九题 或运算的最小翻转次数的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!