191 2021-03-22

【2021.3.22 每日一题】LC 191

  1. java中数据都是有符号数;
  2. 补码的表示方法是:
    正数的补码就是其本身
    负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1. (即在反码的基础上+1);
  3. 使用补码, 不仅仅修复了0的符号以及存在两个编码的问题, 而且还能够多表示一个最低数. 这就是为什么8位二进制, 使用原码或反码表示的范围为[-127, +127], 而使用补码表示的范围为[-128, 127].

[+1] = [00000001]原 = [00000001]反 = [00000001]补
[-1] = [10000001]原 = [11111110]反 = [11111111]补
原码补码: 引用链接.

//1ms(95.2%) 35.2MB(80.86%)
public class Solution {
    // you need to treat n as an unsigned value
    public int hammingWeight(int n) {
        int count=0;
        if(n<0){
            n=n & 0x7fffffff;
            //int类型4个字节,4*8/4=8,16进制需要用0x7fffffff去抹平符号位
            count++;
        }
        for (int i=1;i<32;i++){
            if(n%2==1)count++;
            n=n/2;
        }
        return count; 
    }
}

//tips 1 ms(95.6%) 35.4 MB(56.81%)
public class Solution {
    // you need to treat n as an unsigned value
    public int hammingWeight(int n) {
        int count=0;
        if(n<0){
            n=n & 0x7fffffff;
            count++;
        }      
        while(n!=0){ 
            count+=n&1;
            n>>=1;
        }
        return count; 
    }
}

// LC  1 ms(95.6%) 35.3 MB(66.91%)
public class Solution {
    public int hammingWeight(int n) {
        int ret = 0;
        while (n != 0) {
            n &= n - 1;
            ret++;
        }
        return ret;
    }
}

作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/number-of-1-bits/solution/wei-1de-ge-shu-by-leetcode-solution-jnwf/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

位运算优化 思路及解法

观察这个运算:n&(n - 1)n & (n−1),其预算结果恰为把 nn 的二进制位中的最低位的 11 变为 00 之后的结果。

复杂度分析
时间复杂度:O(log n); 循环次数等于 nn 的二进制位中 1 的个数
空间复杂度:O(1)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值