目次
1、2の累乗
231. 二乗 - LeetCode https://leetcode.cn/problems/power-of-two/?plan=algorithms&plan_progress=gzwnnxs
解決策を見てください。
次に、ビット 1 の数
1. バイナリビットの循環チェック
アイデアと解決策
直接ループして、指定された整数 n の各ビットが 1 であるかどうかを確認できます。
具体的なコードでは、ビット ii をチェックするときに、n の i ビットが 1 の場合に限り、演算結果が 0 でない場合に限り、n と 2^i に AND 演算を実行させることができます。
class Solution {
public:
int hammingWeight(uint32_t n) {
int ret = 0;
for (int i = 0; i < 32; i++) {
if (n & (1 << i)) {
ret++;
}
}
return ret;
}
};
複雑さの分析
時間計算量: O(k)、k は int 型の 2 進数の数、k=32。n の各 2 進数、合計 32 ビットを調べる必要があります。
空間複雑さ: O(1)、いくつかの変数を保存するために必要なのは一定の空間だけです。
2. ビット演算の最適化
アイデアと解決策
この演算を観察してください: n & (n−1)、演算の結果は、n の 2 進ビットの最下位ビット 1 を 0 に変更した結果とまったく同じです。
このように、このビット演算の性質を利用してチェック処理を高速化することができ、実際のコードでは、nn が 0 になるまで、現在の n と n - 1 の AND 演算を続けます。各演算により n の最下位ビットの 1 が反転されるため、演算の数は n の 2 進ビット内の 1 の数に等しくなります。
class Solution {
public:
int hammingWeight(uint32_t n) {
int ret = 0;
while (n) {
n &= n - 1;
ret++;
}
return ret;
}
};
複雑さの分析
時間計算量: O(logn)。サイクル数は、n の 2 進ビット内の 1 の数に等しく、最悪の場合、n のすべての 2 進ビットが 1 になります。ログオン時間をループする必要があります。
空間複雑さ: O(1)、いくつかの変数を保存するために必要なのは一定の空間だけです。