C++ 中使 a 或 b 等于 c 的最小翻转次数
假设我们有 3 个正数 a、b 和 c。我们需要找到 a 和 b 中某些位的最小翻转次数,以使 (a 或 b == c)。这里我们考虑按位或运算。
翻转操作包括将二进制表示中的任何一位从 1 更改为 0 或将 0 更改为 1。因此,如果 a:0010 且 b := 0110,则 c 为 0101,翻转后,a 将为 0001,b 将为 0100
为了解决这个问题,我们将遵循以下步骤 -
- ans := 0
- 对于 i 从 0 到 31 的范围
- bitC := (c / 2^i) AND 1
- bitA := (a / 2^i) AND 1
- bitB := (b / 2^i) AND 1
- 如果 (bitA 或 bitB) 与 bitC 不相同,则
- 如果 bitC 为 0
- 如果 bitA = 1 且 bitB = 1,则将 ans 增加 2,否则将 ans 增加 1
- 否则将 ans 增加 1
- 如果 bitC 为 0
- 返回 ans
示例(C++)
让我们看看以下实现以更好地理解 -
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
int minFlips(int a, int b, int c) {
int ans = 0;
for(int i = 0; i < 32; i++){
int bitC = (c >> i) & 1;
int bitA = (a >> i) & 1;
int bitB = (b >> i) & 1;
if((bitA || bitB) != bitC){
if(!bitC){
if(bitA == 1 && bitB == 1){
ans += 2;
}
else {
ans += 1;
}
}
else{
ans += 1;
}
}
}
return ans;
}
};
main(){
Solution ob;
cout << (ob.minFlips(2,6,5));
}输入
2 6 5
输出
3
广告
数据结构
网络
关系型数据库管理系统
操作系统
Java
iOS
HTML
CSS
Android
Python
C 编程
C++
C#
MongoDB
MySQL
Javascript
PHP