python刷题记录——剑指 Offer 15. 二进制中1的个数
题目:
编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 ‘1’ 的个数(也被称为 汉明重量).)。
你还在用bin(n).count(“1”)接口吗,不如看看其他方法。
方法一: 利用与运算和右移,将二进制数从最右边开始,逐位与1做与位运算。 0&1=0,1&1=1,累加结果,就是最后1的个数
class Solution: def hammingWeight(self, n: int) -> int: res = 0 while n: res += n & 1 n >>= 1 return res
方法二: 方法一中,有多少为二进制就要循环多少次,而方法二是有多少1就循环多少次
class Solution: def hammingWeight(self, n: int) -> int: res = 0 while n: res += 1 # 记录循环次数 n &= n-1 # 逐渐将每个1变为0的关键步骤 return res
关键步骤中,分两步理解。 第一步,先将n-1。n-1会有什么效果? n-1会将从n最右边的1开始的数,全都置反,最右边1的左边不变。例如001100,减1后为001011。 第二步,再将n-1的结果和n做位与运算,上一步中将最右边1以及右边的0都置反了,做与运算当然都是0了,比如上面得到的001011和001100做与运算为00100,你看,是不是消灭最右边的1,变成0了。再循环,直到n变成000000为止。
下一篇:
【剑指offer刷题笔记】