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
-
バイナリツリーのすべてのリーフノードをC++で右から左に印刷します
この問題では、二分木が与えられ、二分木のすべてのリーフノードを右から左に印刷する必要があります。 問題を理解するために例を見てみましょう 入力 − 出力 − 7 4 1 この問題を解決するには、二分木をトラバースする必要があります。このトラバーサルは2つの方法で実行できます- プレオーダートラバーサル −このトラバーサルは再帰を使用します。ここでは、トラバース、ルート、左、右のサブツリーを作成します。リーフノードに遭遇した場合はそれを印刷します。それ以外の場合は、ノードの子をチェックし、それらを探索してリーフノードを見つけます。 例 ソリューションの実装を示すプログラム-
-
C++での演算子の優先順位
演算子の優先順位は、式内の用語のグループ化を決定します。演算子の結合性は、括弧がない場合に同じ優先順位の演算子をグループ化する方法を決定するプロパティです。これは、式の評価方法に影響します。特定の演算子は他の演算子よりも優先されます。たとえば、乗算演算子は加算演算子よりも優先されます: たとえば、x =7 + 3 * 2;ここでは、演算子*の優先順位が+よりも高いため、xには20ではなく13が割り当てられます。したがって、最初に3 * 2が乗算され、次に7に加算されます。 ここでは、優先順位が最も高い演算子が表の上部に表示され、優先順位が最も低い演算子が下部に表示されます。式内では、優先順位