C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

C++でORbをcに等しくするための最小フリップ


3つの正の数a、b、cがあるとします。作成するためにaとbのいくつかのビットで必要な最小フリップを見つける必要があります(a OR b ==c)。ここでは、ビット単位のOR演算を検討しています。

フリップ操作は、バイナリ表現で任意の単一ビットを1から0に変更するか、ビット0を1に変更することで構成されます。したがって、a:0010およびb:=0110の場合、cは0101です。フリップ後、aは0001になり、bは0100になります

これを解決するには、次の手順に従います-

  • ans:=0
  • 0から31の範囲のiの場合
    • 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増やします
  • 回答を返す
例(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

  1. C++を使用して2つの文字列を等しくするために必要な特定の操作の最小数。

    問題の説明 2つの文字列str1とstr2がある場合、両方の文字列に文字「a」と「b」が含まれます。両方の文字列は同じ長さです。両方の文字列に1つの_(空のスペース)があります。タスクは、次の操作の最小数を実行することにより、最初の文字列を2番目の文字列に変換することです- _が位置Iにある場合、_は位置i+1またはi-1の文字と交換できます 位置i+1とi+2の文字が異なる場合、_は位置i+1またはi+2の文字と交換できます 同様に、位置i-1とi-2の文字が異なる場合、_は位置i-1またはi-2の文字と交換できます str1 =“ aba_a”およびstr2 =“

  2. C++で文字列回文を作成するための削除の最小数。

    問題の説明 サイズ「n」の文字列が与えられます。タスクは、文字列回文を作成するために最小数の文字を削除することです。 指定された文字列が「abcda」の場合、最初と最後を除く任意の2文字を削除して、回文にすることができます。 文字「b」と「c」を削除すると、「ada」文字列は回文になります 文字「c」と「d」を削除すると、「aba」文字列は回文になります 文字「b」と「d」を削除すると、「aca」文字列は回文になります アルゴリズム 1. Find longest palindromic subsequence of given string. Let’s