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に加算されます。 ここでは、優先順位が最も高い演算子が表の上部に表示され、優先順位が最も低い演算子が下部に表示されます。式内では、優先順位