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

C++のバイナリ表現での2つの直接の1の間の最大0


問題の説明

数値nが与えられた場合、タスクは、与えられたnの2進表現で2つの直接の1の間の最大0を見つけることです。バイナリ表現に含まれる1が2つ未満の場合は-1を返します

入力番号が35の場合、その2進表現は-

です。

00100011

上記のバイナリ表現では、2つの直接の1の間に30があります。したがって、答えは3です。

アルゴリズム

この問題を解決するには、ビット単位のシフト演算子を使用できます。 nの2進表現で2つの直接1の位置を見つけ、これらの位置の差を最大化する必要があります。

  • 数値が0または2の累乗の場合は、-1を返します
  • IInitialize変数prevを、最初の右端の位置1で保存します。これは、以前に表示された1の位置を格納します。
  • 前の直後の1の位置を格納する別の変数curを取得します。
  • itakeのcur– prev – 1の差は、0から直前の1までの数になり、以前の最大値である0と比較してprevを更新します。 prev=curは次の反復に使用します。
  • IUse変数setBitは、nのすべてのビットをスキャンし、現在のビットが0または1かどうかを検出します。補助変数setBitは、nのすべてのビットをスキャンし、現在のビットが0または1かどうかを検出します。

例を見てみましょう-

#include <bits/stdc++.h>
using namespace std;
int getMaxZeros(int n) {
   if (n == 0 || (n & (n - 1) == 0)) {
      return -1;
   }
   int setBit = 1;
   int prev = 0;
   int i;
   for (i = 1; i < sizeof(int) * 8; ++i) {
      ++prev;
      if ((n & setBit) == setBit) {
         setBit = setBit << 1;
         break;
      }
      setBit = setBit << 1;
   }
   int maxZeros = INT_MIN;
   int cur = prev;
   for (int j = i + 1; j <= sizeof(int) * 8; ++j) {
      ++cur;
      if ((n & setBit) == setBit) {
         if (maxZeros < (cur - prev - 1)) {
            maxZeros = cur - prev - 1; prev = cur;
         }
      }
      setBit = setBit << 1;
   }
   return maxZeros;
}
int main() {
   int n = 35;
   cout << "Maximum zeros = " << getMaxZeros(n) << endl;
   return 0;
}

出力

Maximum zeros = 3

  1. C++で二分木の2つのノード間の距離を見つける

    ノードが少ない二分木があると考えてください。 2つのノードuとvの間の距離を見つける必要があります。ツリーが次のようになっていると仮定します- これで、(4、6)=4の間の距離、パスの長さは4、(5、8)の間の長さ=5などになります。 この問題を解決するために、LCA(Lowest Common Ancestor)を見つけてから、LCAから2つのノードまでの距離を計算します。 例 #include<iostream> using namespace std; class Node {    public:       in

  2. C++プログラミングのバイナリツリー内の任意の2つのノード間のパスを出力します。

    個別のノードのバイナリツリーと、バイナリツリー内のパスを出力するバイナリツリーの2つのノードが与えられます。 例 −ノード140から211の間のパスを出力して、その出力が次のようになるようにします- Output: 140->3->10->211 アイデアは、ルートノードから2つのノードへのパスを見つけて、それらを2つの別々のベクトルまたは配列(path1とpath2など)に格納することです。 ここで、2つの異なるケースが発生します- 2つのノードがルートノードの異なるサブツリーにある場合 − 2つのノードが、1つが左に、もう1つが右のように異なるサブツリーにあ