题目来源:
https://www.nowcoder.com/practice/8ee967e43c2c4ec193b040ea7fbb10b8?tpId=13&tqId=11164&tPage=1&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking
分析:
计算二进制中1的个数,以前在LeetCode上面好像遇到过这个题目,记得当是也是对答案拍案叫绝,这次尽然没有想起来
自己的代码:
class Solution: def NumberOf1(self, n): # write code here count=0 if n<0: n=n&0xffffffff while n!=0: count+=1 n= n&(n-1) return count
代码效率/结果:
优秀代码:
代码效率/结果:
自己优化后的代码:
反思改进策略:
1.怎么统计1的个数?
利用小技巧x&(x-1)可以将整数最右边的1变成0,通过这个小技巧,我们只要循环判断n=n&(n-1)是否为0,即可统计1的个数。
2.关于计算机中补码的操作
9的源码为0000 1001,
如果是负数的话,补码为最高位置1 ,
其余取反也就是1111 0110,然后在最低位加1即可即1111 0111
在python里面也是这样存储的,这里有一个问题:如果负数的话,不处理,那么n-1这个操作,会使得10000,下一次全部变成11111,因为符号位是不会右移变成0的,会不断补充1进去
这里使用一个方法,n &
0xffffffff,这样可以使带符号数变成无符号数,这样就可以顺利的通过-1操作来计数里面1的个数
简单一句话:就是把补码变成无符号数
具体解释:http://www.cnblogs.com/lazycoding/archive/2011/03/21/unsigned-signed.html
写题时间时长:
1hou