剑指offer刷题-数二进制表示中1的个数

2019-04-13 16:45发布

题目描述

时间限制:1秒 空间限制:32768K 热度指数:294626
输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
当n>0时,就容易处理了 s = '%s' % bin(n) return s.count('1') 即可
n<0的时候要计算n的补码
模 = abs(n) + n的补码
n的补码 = 模 - abs(n)
其中模的概念如下
“模”是指一个计量系统的计数范围。如时钟等。计算机也可以看成一个计量机器,它也有一个计量范围,即都存在一个“模”。例如:
时钟的计量范围是0~11,模=12。表示n位的计算机计量范围是0~2(n)-1,模=2(n)。
“模”实质上是计量器产生“溢出”的量,它的值在计量器上表示不出来,计量器上只能表示出模的余数。任何有模的计量器,均可化减法为加法运算。
因此完整的代码如下 # -*- coding:utf-8 -*- def intToBin32(i): #return (bin(((1 << 32) - 1) & i)[2:]).zfill(32) # 也可以使用这个方法计算补码 return (bin((1 << 32) - abs(i))) class Solution: def NumberOf1(self, n): # write code here if n <0: s = '%s' % intToBin32(n) else: s = '%s' % bin(n) return s.count('1')