• 《剑指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
    
  • 相关阅读:
    MySQL主从半同步复制
    MySQL主从之延时复制
    MySQL备份
    MySQL主从介绍及搭建(异步复制)
    MySQL物理备份Xtrabackup
    MySQL数据库误删除数据恢复
    MySQL--日志
    JAVA日报
    JAVA日报
    JAVA日报
  • 原文地址:https://www.cnblogs.com/lliuye/p/9101161.html
Copyright © 2020-2023  润新知