题目描述
编写一个函数,输入是一个无符号整数,返回其二进制表达式中数字位数为 ‘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; } }
本文作者:
whtli
本文链接: https://hexo.whtli.cn/archives/a6ecccb7.html
版权声明: 遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
本文链接: https://hexo.whtli.cn/archives/a6ecccb7.html
版权声明: 遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。