• 二进制 中 1 的 个数


    题目来源:

     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

  • 相关阅读:
    java中4种修饰符访问权限的区别
    Java中List的排序方法
    Hibernate事务
    @Component、@Service、@Constroller
    MySQL查看一个表的创建文本以及删除表某列的索引
    深入Session2
    Tomcat容器的Session管理
    深入Session
    使用spring mvc或者resteasy构建restful服务
    Spring MVC学习回顾
  • 原文地址:https://www.cnblogs.com/captain-dl/p/10671132.html
Copyright © 2020-2023  润新知