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

C++でゼロに反転


numsという整数配列が1つあり、これに0と1が含まれているとします。数値でインデックスiを選択し、インデックスiで要素を反転し、iの右側にあるすべての数値を反転する操作があるとします。 numにすべて0を含めるために必要な操作の最小数を見つける必要があります。

したがって、入力が[1,0,1]の場合、出力は3になり、インデックス0で操作され、[0,1,0]に変換され、次にインデックス1で[ 0,0,1]、次にインデックス2、[0,0,0]。

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

  • n:=numsのサイズ

  • サイズnの配列opを定義します

  • ret:=0

  • 初期化i:=0の場合、i

    • i --1> =0の場合、-

      • op [i]:=op [i] + op [i-1]

    • (nums [i] + op [i])&1がゼロ以外の場合、-

      • (op [i]を1増やします)

      • (retを1増やします)

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

#include <bits/stdc++.h>
using namespace std;
class Solution {
   public:
   int solve(vector<int>& nums) {
      int n = nums.size();
      vector<int> op(n);
      int ret = 0;
      for (int i = 0; i < nums.size(); i++) {
         if (i - 1 >= 0) {
            op[i] += op[i - 1];
         }
         if ((nums[i] + op[i]) & 1) {
            op[i]++;
            ret++;
         }
      }
      return ret;
   }
};
main() {
   Solution ob;
   vector<int> v = {1,0,1};
   cout << (ob.solve(v));
}

入力

{1,0,1}

出力

3

  1. C++で同等の二分木を反転する

    二分木があるとします。二分木を反転する必要があります。フリップは次のことを示します。任意のノードを選択し、左右の子サブツリーを交換します。ここで、バイナリツリーXは、いくつかのフリップ操作の後でXからYを作成できる場合に限り、バイナリツリーYとフリップ同等になります。 2つの二分木がフリップ等価であるかどうかを判断するメソッドを作成する必要があります。ツリーはルートノードroot1とroot2によって与えられます。したがって、木が- 次に、値1、3、および5のノードを反転すると、出力はtrueになります。 これを解決するには、次の手順に従います- 1つの再帰関数solve

  2. C++の文字列から後続ゼロを削除します

    このプログラムでは、C++の文字列から末尾のゼロを削除する方法を説明します。一部の文字列には、「00023054」のように末尾のゼロが含まれる場合があります。このプログラムを実行すると、「23054」のみが返されます。最初のゼロは削除されます。 Input: A string with trailing zeros “000023500124” Output: “23500124” アルゴリズム Step 1: Get the string Step 2: Count number of trailing zeros n Step 3: Remo