剣はオファーを指します--15。バイナリの1の数

トピックは次のとおりです。

関数を実装し、整数(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;
    }
}

おすすめ

転載: blog.csdn.net/pary__for/article/details/114366062