目录
题目:
示例:
分析:
题目给我们 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;
}
};