PS:本题解是看了力扣用户“hlxingL5”的题解写出来的,基本是根据他的思路做的。
题意:
给你三个正整数 a、b 和 c。
你可以对 a 和 b 的二进制表示进行位翻转操作,返回能够使按位或运算 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
难度:★★☆☆☆
思路:
对a,b,c的每一位分离出来并右移进行位或( | )运算,记为av、bv、cv,如果av | bv == cv,则不需计数。
但不等于时,分为两种情况:
1、cv == 1时,av或bv翻转一次即可。
2、cv == 0时,那么av和bv都需要等于0,如果av == 1,就要翻转一次成0,如果bv == 1,也是要翻转一次。
答题代码:
class Solution {
public int minFlips(int a, int b, int c) {
int ans = 0;
while(a != 0 || b != 0 || c != 0)
{
int av = a & 1,bv = b & 1,cv = c & 1;
a >>= 1;
b >>= 1;
c >>= 1;
if((av | bv) == cv)
{
continue;
}else
{
if(cv == 1)
{
ans++;
}else
{
if(av == 1)
{
ans++;
}
if(bv == 1)
{
ans++;
}
}
}
}
return ans;
}
}