《剑指offer》---二进制中1的个数
本文算法使用python3实现
1 题目描述:
输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示
时间限制:1s;空间限制:32768K
2 思路描述:
方法一:对整数的二进制表示的每一位与 1 求与,所得结果为非 0 的个数,即为一个整数二进制表示中 1 的个数,这种算法所需的移位次数至少为整数的二进制表示中,数字 1 所在的最高位的位次。(例子:7 的二进制表示为 111,第一次111 & 001 得到 001为非零 ,用111 - 001 = 110,第二次110&010得到010为非零,用110-010=100,第三次100&100=100得到100为非零,用100-100=000此时跳出循环,7的二进制中1的个数为3 )
方法二:不采用移位操作,而是用整数 i 与这个整数减 1 的值 i - 1,按位求与,如此可以消除,整数的二进制表示中,最低位的 1 。(例子: 7的二进制为111,第一次111&110=110不为零,第二次110&101=100不为零,第三次100&011=000为零,跳出循环。 )
注意:Python 数值类型(Numeric Type)不会出现溢出的情况,所以,此时,还需要对边界值进行限定。在 Python 程序中,当对一个负整数与其减 1 后的值按位求与,若结果为 0 退出,循环执行此过程。由于整型数可以有无限的数值精度,其结果永远不会是 0,如此编程,在 Python 中,只会造成死循环。
3 程序代码:
(1)方法一
class Solution:
def NumberOf1_3(self, n):
INT_BITS = 32
MAX_INT = (1 << (INT_BITS - 1)) - 1
if n == 0:
return 0
count, bit = 0, 1
while n != 0 and bit <= MAX_INT + 1:
if bit & n:
count += 1
n -= bit
bit = bit << 1
return count
(2)方法二:
class Solution:
def NumberOf1_2(self, n):
INT_BITS = 32
MAX_INT = (1 << (INT_BITS - 1)) - 1
if n == 0:
return 0
count = 0
while n != 0:
if n < -MAX_INT - 1 or n > MAX_INT:
break
count += 1
n = n & (n-1)
return count