《剑指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
posted @ 2018-05-28 17:25  EEEEEcho  阅读(190)  评论(0编辑  收藏  举报