LeetCode 瞑想: ビットを数える

Barbara Streisand
Barbara Streisandオリジナル
2024-12-27 16:41:10698ブラウズ

LeetCode Meditations: Counting Bits

ビットのカウントの説明には次のように書かれています:

整数 n を指定すると、長さ n 1 の配列を返します。 i (0 、 ans[i] の数字ですof 1 のバイナリ表現 i.

例:

Input: n = 2
Output: [0, 1, 1]

Explanation:
0 --> 0
1 --> 1
2 --> 10

または:

Input: n = 5
Output: [0, 1, 1, 2, 1, 2]

Explanation:
0 --> 0
1 --> 1
2 --> 10
3 --> 11
4 --> 100
5 --> 101

この問題では、0 から n までの各数値の 2 進表現の 1 の数を取得する必要があります。

私が思いついた最初の解決策は、長さ n 1 の配列を作成し、それにバイナリの 0 から n までの値を入れることでした...

const arr = Array.from({ length: n + 1 }, (_, i) => i.toString(2));

...そして、それぞれをそれが持つ 1 ビットの数にマッピングします:

arr.map(j => {
  let result = 0;
  let binaryNumber = parseInt(j, 2);
  while (binaryNumber > 0) {
    binaryNumber &= binaryNumber - 1;
    result++;
  }
  return result;
});

前の問題では、1 ビットの数を数える (またはその ハミング重み を計算する) テクニックを使用したことに注意してください。これは、数値が 1 に達するまで、数値から 1 つ小さい値を単純に減らしているだけです。 0:

let numberOf1Bits = 0;
while (binaryNumber > 0) {
  binaryNumber &= binaryNumber - 1;
  numberOf1Bits++;
}

メソッドを連鎖させることができ、全体的なソリューションは次のようになります。

function countBits(n: number): number[] {
  return Array.from({ length: n + 1 }, (_, i) => i.toString(2)).map(j => {
    let result = 0;
    let binaryNumber = parseInt(j, 2);
    while (binaryNumber > 0) {
      binaryNumber &= binaryNumber - 1;
      result++;
    }
    return result;
  });
}

または、各カウントを結果配列にプッシュして、より明示的に記述することもできます。

Input: n = 2
Output: [0, 1, 1]

Explanation:
0 --> 0
1 --> 1
2 --> 10

時間と空間の複雑さ

設定されたビットをカウントすると、 log nログn ログ 時間計算量 (すべてのビットが設定されている最悪の場合、ループは binaryNumber のビット数 (数値の 2 進表現のビット数) を実行します) nn n log nログn ログ ).
ただし、私たちもやってます nn n したがって、全体的な時間計算量は次のようになります。 O(n log n)O(n log n) O(n log n) .

空間の複雑さは O(n)O(n) O(n) 結果配列のためのスペースの必要性が増加するため、 nn n 増加します。


次に、リバース ビットについて見ていきます。それまで、コーディングを楽しんでください。

以上がLeetCode 瞑想: ビットを数えるの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。