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

C ++で1回フリップすると、バイナリ表現で1の最長シーケンスを検索します


整数nが1つあるとします。その中で、1ビットフリップを作成して、1の最長シーケンスを生成できます。数値が13であるとすると、2進表現は1101になります。make0から1として1ビットフリップを行うと、1111になります。これは1の最長シーケンスです

この問題を解決するために、与えられた数のビットをウォークスルーします。現在の1のシーケンス長と前の1のシーケンス長を追跡します。ゼロが見つかったら、前の長さを更新します。したがって、次のビットが1の場合、前の長さを現在の長さに設定する必要があります。次の値が0の場合は、前の値を再び0にします。

#include<iostream>
using namespace std;
int singleFlipMaxOnes(unsigned number) {
   if (~number == 0)
      return 8*sizeof(int);
   int curr = 0, prev = 0, max_size = 0;
   while (number!= 0) {
      if ((number & 1) == 1)
         curr++;
      else if ((number & 1) == 0) {
         prev = (number & 2) == 0? 0 : curr;
         curr = 0;
      }
      max_size = max(prev + curr, max_size);
      number >>= 1;
   }
   return max_size+1;
}
int main() {
   cout << "Maximum length of the sequence with 1s: " << singleFlipMaxOnes(13);
}

出力

Maximum length of the sequence with 1s: 4

  1. C++での二分木最長連続シーケンス

    二分木があるとしましょう。連続する最長のシーケンスパスの長さを見つけることができるかどうかを確認する必要があります。パスが、親子接続に沿ったツリー内の開始ノードから任意のノードまでのノードのシーケンスを参照している場合。最長の連続パスは、親から子をたどる必要がありますが、逆にする必要はありません。 したがって、入力が次のような場合、 最長の連続シーケンスパスは3-4-5であるため、出力は3になります。したがって、3を返します。 これを解決するには、次の手順に従います- 関数solveUtil()を定義します。これにより、ノード、prev、lenが1で初期化されます。 ノ

  2. C++で整数の1の補数を見つける

    このセクションでは、整数の1の完全なものを見つける方法を説明します。補数演算子を使用してこのタスクを非常に高速に実行できますが、32ビットの補数値(4バイト整数)になります。ここでは、nビット数の補数が必要です。 22という数値があるとします。2進数に相当するものは10110です。補完された値は01001で、これは9と同じです。ここで問題が発生します。この値を見つける方法は?最初に、与えられた数のビット数を見つける必要があります。カウントがcであると仮定します(ここでは、22の場合はc =5)。 51を作成する必要があります。したがって、これは11111になります。これを行うには、1を左にc