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

【C#】整数の2進数表現における最長の連続する「1」の長さを求めるプログラム

整数の2進数表現の中で、最も長く連続している「1」の長さを求めるには、ビットごとの左シフト演算子(Bitwise Left Shift Operator)を使用します。まず、対象となる10進数の値を用意しましょう。

i = (i & (i << 1));

この処理を、変数 i の値が 0 になるまで while ループで繰り返し、別途用意した変数 count を使って繰り返し回数(=連続する1の長さ)をカウントします。

while (i != 0) {
    i = (i & (i << 1));
    count++;
}

仕組みの解説

このアルゴリズムでは、元の数値と、それを1ビット左にシフトした値との論理積(AND)を計算します。AND演算を行うたびに、連続する「1」の並びが1ビットずつ短くなっていくため、結果が 0 になるまでに実行された回数が、そのまま最長の連続する「1」の個数となります。

ここでは例として、10進数の「150」を取り上げます。

150 の2進数表現は 10010110 です。したがって、この中で最も長く連続している「1」の個数は 2 ということになります。

サンプルコード

using System;
class Demo {
    private static int findConsecutive(int i) {
        int count = 0;
        while (i != 0) {
            i = (i & (i << 1));
            count++;
        }
        return count;
    }

    // ドライバーコード
    public static void Main() {
        // 150 の2進数表現は 10010110
        Console.WriteLine(findConsecutive(150));
    }
}

出力結果

2
  1. Pythonで二分木の最長連続パスの長さを求めるアルゴリズムと実装

    二分木(バイナリツリー)が与えられたとき、木の中にある最長の連続パスの長さを求めることを考えます。ここでの「連続パス」とは、隣り合うノードの値が1ずつ増加、または1ずつ減少していくようなノードの並びのことです。問題の例例えば、次のような二分木が入力として与えられたとします。この場合、最も長い連続シーケンスは [2, 3, 4, 5, 6] となるため、出力は 5 になります。解き方のアプローチこの問題は、再帰的に各ノードを訪問しながら「増加パス」と「減少パス」の長さを追跡することで解けます。手順は以下の通りです。ルートがnullの場合は0を返す最大パス長を記録する変数 maxPath を0で初

  2. Pythonで二分木の最長交互パス(ジグザグパス)の長さを求めるプログラム

    問題概要 二分木が与えられたとき、「左の子 → 右の子 → 左の子…」のように左右交互にたどりながら下へ進む最長のパス(交互パス)の長さを求めます。 例として、次のような二分木が入力されたとします。 この場合、交互パスは [2, 4, 5, 7, 8] となるため、出力は 5 になります。 解き方のステップ この問題を解くには、以下の手順に従います。 ルートが null(空)の場合は 0 を返します。 dfs() 関数を定義します。この関数は node(現在のノード)、count(現在のパス長)、flag(次に進むべき方向)を引数に取ります。 node が null でない場合: f