トピックは次のとおりです。
関数を実装し、整数(2進文字列の形式)を入力し、数値の2進表現で1の数を出力してください。たとえば、9が2進数で表される場合、1001であり、2ビットは1です。したがって、9を入力すると、関数は2を出力します。
例1:
入力:00000000000000000000000000001011
出力:3
説明:入力バイナリー文字列00000000000000000000000000001011では、合計3ビットが「1」です。
例2:
入力:00000000000000000000000010000000
出力:1
説明:入力バイナリー文字列00000000000000000000000010000000では、合計1ビットが「1」です。
例3:
入力:11111111111111111111111111111101
出力:31
説明:入力バイナリー・ストリング11111111111111111111111111111101では、合計31ビットが「1」です。
ヒント:
入力は、長さが32のバイナリ文字列である必要があります。
独自のアルゴリズムとコード(演算結果が間違っている)
nを文字列型に変換してから、その中の各文字を順番に処理し、1の数を数えます。
(この結果は間違っていますが、現時点ではこのアイデアの何が問題なのかわかりません)
public class Solution {
public static int hammingWeight(int n) {
int count = 0;
String str = String.valueOf(n);
for (int i = 0; i < str.length(); i++){
char c = str.charAt(i);
if (c == '1'){
count++;
}
}
return count;
}
public static void main(String[] args) {
int num = Integer.parseInt("00000000000000000000000000001011");
int result = hammingWeight(num);
System.out.println(result);
}
}
参照アルゴリズムとコード:
アルゴリズムのアイデア:
- 数量統計変数を初期化します
res
。 - 右端のループ除去1:
n = 0
時間がジャンプしたとき。
res += 1
:統計変数に1を追加します
n &= n - 1
;:数値nの右端の1を削除します。 - 統計量resを返します。
注:
(n−1)
分析:2進数nの右端の1は0になり、この1の右側のすべての0は1になります。n & (n - 1)
分析:2進数nの右端の1は0になり、残りは変更されません。
アルゴリズム実行プロセスの例
n = 10101000
例えば、コードの実行は次の通り:
コードは次のとおりです。
public class Solution {
public int hammingWeight(int n) {
int res = 0;
while(n != 0) {
res++;
n &= n - 1;
}
return res;
}
}