Leetcode191–位1的个数
编写一个函数,输入是一个无符号整数,返回其二进制表达式中数字位数为 ‘1’ 的个数(也被称为汉明重量)。
作者:黑暗主宰
邮箱:shengzhanhe@gmail.com
Leetcode191–位1的个数
题目描述
原题链接:
https://leetcode-cn.com/problems/number-of-1-bits/ (中文)
https://leetcode.com/problems/number-of-1-bits/ (英文)
题目描述:
编写一个函数,输入是一个无符号整数,返回其二进制表达式中数字位数为 ‘1’ 的个数(也被称为汉明重量。
示例 1: 输入:00000000000000000000000000001011 输出: 3 解释: 输入的二进制串 00000000000000000000000000001011 中,共有三位为 ‘1’。 |
---|
示例 2: 输入:00000000000000000000000010000000 输出: 1 解释: 00000000000000000000000010000000 中,共有一位为 ‘1’。 |
---|
示例 3: 输入:11111111111111111111111111111101 输出: 31 解释:输入的二进制串 11111111111111111111111111111101 中,共有 31 位为 ‘1’。 |
---|
解题思路
这道题是一个位运算操作的题,最简答的思路就是不断的把数字右移,如果非零,累计数量加1,直到数字移位等于0,循环结束。
def hammingWeight(n):
count = 0
while n:
if n & 1 == 1:
count += 1
n = n >> 1
return count
剑指offer上说这样解可能陷入死循环,但是leetcode提交后也AC了(XD)。那剑指offer上的例子来说,就是加入输入的是 0x80000000
,右移移位的话,不是得到 0x40000000
而是得到 0xC0000000
,所以一直右移的话,会得到 0xFFFFFFFF
,陷入死循环。(leetcode中为什么这样写可以AC呢,估计是因为python语言的特性吧)
然后,假如右移会存在进入死循环的可能,怎么避免呢,可以逆向思维,设置一个flag,初始值为1,每次把flag向左移一次,最大的数是32位,所以移动32次,就可以统计出来1的个数
def hammingWeight(n):
count = 0
flag = 1
for i in range(32):
if n & flag:
count += 1
flag = flag << 1
return count
另外就是剑指offer上提供的一种比较巧的解法,就是说我们假如一个数字的有m个1,我们每次把从第一个1开始反转,直到第m个,这样要求解的整数n就变成了零,具体的,我们画个图说明一下,
代码如下
def hammingWeight(n):
cnt = 0
while n:
cnt += 1
n &= (n-1)
return cnt
最后,再来一个python独有的骚操作,一行代码解题
def hammingWeight(n):
return str(bin(n)).count('1')
欢迎大家关注我的个人公众号,同样的也是和该博客账号一样,专注分享技术问题,我们一起学习进步
注: 文中有写错的地方,欢迎大家不吝指正!!!