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
  • 返回 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

更新于:2020-04-30

593 次浏览

开启你的 职业生涯

通过完成课程获得认证

开始学习
广告

© . All rights reserved.