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

与えられたバイナリ文字列から最小の正しい文字列を見つけるためのC++コード


nビットのバイナリ文字列Sがあるとします。冗長な先行ゼロはありません。 Sで2つの異なる操作を実行できます-

  • 隣接するビットの任意のペアを交換します

  • すべての「11」を「1」に置き換えます

val(S)をSの10進表現とします。val(A)の場合、正しい文字列Aが別の正しい文字列'B'よりも小さい最小の正しい文字列を見つける必要があります。

したがって、入力がS ="1001"の場合、出力は100になります。これは、 "1001"-> "1010"->"1100"->"100"のような操作を実行できるためです。

ステップ

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

n := size of S
res := a blank string
res := res + S[0]
for initialize i := 1, when i < n, update (increase i by 1), do:
   if S[i] is same as '0', then:
      res := res concatenate "0"
return res

理解を深めるために、次の実装を見てみましょう-

#include <bits/stdc++.h>
using namespace std;
string solve(string S){
   int n = S.size();
   string res = "";
   res += S[0];
   for (int i = 1; i < n; i++){
      if (S[i] == '0'){
         res += "0";
      }
   }
   return res;
}
int main(){
   string S = "1001";
   cout << solve(S) << endl;
}

入力

"1001"

出力

100

  1. C++で文字列から二分木を構築する

    括弧と整数で構成される文字列があるとします。その文字列から二分木を構築する必要があります。入力全体が二分木を表します。これは、0、1、または2組の括弧が後に続く整数を保持します。整数はルートの値を表し、括弧のペアには同じ構造の子二分木が含まれます。 したがって、入力が「4(2(3)(1))(6(5))」の場合、出力は[3,2,1,4,5,6](順序付き走査)になります これを解決するには、次の手順に従います- 関数solve()を定義します。これには、s、idx、が必要です。 =sのサイズの場合、- nullを返す num:=空の文字列 while(

  2. C++のバイナリツリーでルートから特定のノードまでの距離を検索します

    ノードが少ない二分木があると考えてください。ルートと別のノードuの間の距離を見つける必要があります。ツリーが次のようになっているとします。 これで、(root、6)=2の間の距離、パスの長さは2、(root、8)=3の間の距離などになります。 この問題を解決するために、再帰的アプローチを使用して、左右のサブツリーでノードを検索し、各レベルの長さも更新します。 例 #include<iostream> using namespace std; class Node {    public:       int data; &