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

C++ですべての1を左に、0を右に作成するための最小フリップ


問題の説明

左側のすべての1と右側のすべての0を反転できるバイナリ文字列があるとします。タスクは、すべて1を左に、すべて0を右にするために必要な最小フリップを計算することです

与えられたバイナリ文字列は0010101です。この文字列には、3つの1ビットと4つの0ビットがあります。以下に示すように、ハイライトされた4ビットを反転して、すべて1を左に、すべて0を右にする必要があります-

0010101

文字列を反転した後は-

になります

1110000

アルゴリズム

  • 文字列を左から右にトラバースし、すべての0を1に変換するために必要なフリップの数を計算します。
  • 文字列を右から左にトラバースし、1から0まですべてを変換するために必要なフリップの数を計算します
  • ビット間のすべての位置をトラバースして、(0のフリップ+ 1のフリップ)の最小値を見つけます

#include <iostream>
#include <string>
#include <climits>
using namespace std;
int minFlips(string binaryString) {
   int n = binaryString.length();
   int flipCnt, zeroFlips[n], oneFlips[n];
   flipCnt = 0;
   for (int i = 0; i < n; ++i) {
      if (binaryString[i] == '0') {
         ++flipCnt;
      }
      zeroFlips[i] = flipCnt;
   }
   flipCnt = 0;
   for (int i = n - 1; i >= 0; --i) {
      if (binaryString[i] == '1') {
         ++flipCnt;
      }
      oneFlips[i] = flipCnt;
   }
   int minFlips = INT_MAX;
   for (int i = 1; i < n; ++i) {
      int sum = zeroFlips[i - 1] + oneFlips[i]; if (sum < minFlips) {
         minFlips = sum;
      }
   }
   return minFlips;
}
int main() {
   string binaryString = "0010101";
   cout << "Minimum flips: " << minFlips(binaryString) <<
   endl;
   return 0;
}

出力

上記のプログラムをコンパイルして実行する場合。次の出力を生成します-

Minimum flips: 4

  1. バイナリツリーのすべてのリーフノードをC++で右から左に印刷します

    この問題では、二分木が与えられ、二分木のすべてのリーフノードを右から左に印刷する必要があります。 問題を理解するために例を見てみましょう 入力 − 出力 − 7 4 1 この問題を解決するには、二分木をトラバースする必要があります。このトラバーサルは2つの方法で実行できます- プレオーダートラバーサル −このトラバーサルは再帰を使用します。ここでは、トラバース、ルート、左、右のサブツリーを作成します。リーフノードに遭遇した場合はそれを印刷します。それ以外の場合は、ノードの子をチェックし、それらを探索してリーフノードを見つけます。 例 ソリューションの実装を示すプログラム-

  2. C++での演算子の優先順位

    演算子の優先順位は、式内の用語のグループ化を決定します。演算子の結合性は、括弧がない場合に同じ優先順位の演算子をグループ化する方法を決定するプロパティです。これは、式の評価方法に影響します。特定の演算子は他の演算子よりも優先されます。たとえば、乗算演算子は加算演算子よりも優先されます: たとえば、x =7 + 3 * 2;ここでは、演算子*の優先順位が+よりも高いため、xには20ではなく13が割り当てられます。したがって、最初に3 * 2が乗算され、次に7に加算されます。 ここでは、優先順位が最も高い演算子が表の上部に表示され、優先順位が最も低い演算子が下部に表示されます。式内では、優先順位