LeetCode精选TOP面试题191. 位1的个数

题目描述

编写一个函数,输入是一个无符号整数,返回其二进制表达式中数字位数为 ‘1’ 的个数(也被称为汉明重量)。

示例 1:
输入:00000000000000000000000000001011
输出:3
解释:输入的二进制串 00000000000000000000000000001011 中,共有三位为 '1'
示例 2:
输入:00000000000000000000000010000000
输出:1
解释:输入的二进制串 00000000000000000000000010000000 中,共有一位为 '1'
示例 3:
输入:11111111111111111111111111111101
输出:31
解释:输入的二进制串 11111111111111111111111111111101 中,共有 31 位为 '1'

解题思路

  • 思路1
    转换成二进制字符串,for循环统计字符1出现的次数,并返回 最终的和;
  • 思路2
    遍历数字的 32 位,进行按位与运算,如果某一位是 1 ,计数器就加 1,在此过程中让辅助的与运算对象不断左移,这样来保证按位与
  • 思路3
    在思路2按位与的基础上进行优化,让n不断和和n - 1 进行与运算,并把每次与运算的结果赋值给n,这样能保证只要n 等于 0,那么统计就结束了,每进行一次与运算,就说明当前n的二进制中还有1存在。

代码(Java)

  • 思路1
// 字符串 - 循环计数
public class Solution {
    public int hammingWeight(int n){
        int count = 0;
        String str = Integer.toBinaryString(n);
        for (int i = 0; i < str.length(); i++){
            if (str.charAt(i) == '1'){
                count ++;
            }
        }
        return count;
    }
}
  • 思路2
// 按位与
public class Solution {
    public int hammingWeight(int n){
        int count = 0;
        int mask = 1;
        for (int i = 0; i < 32; i++) {
            if ((n & mask) != 0) {
                count++;
            }
            mask <<= 1;
        }
        return count;
    }
}
  • 思路3
// 优化的按位与
public class Solution {
    public int hammingWeight(int n){
        int count= 0;
        while (n != 0) {
            count++;
            n &= (n - 1);
        }
        return count;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章