算法打卡Day24_leetcode _338. 比特位数

人生不过是居家、出门、又回家。我们一切的情感、理智和意志上的追求或企图,不过是灵魂的思乡病。想找一个人、一件事、一处地位,容许我们的身心在这茫茫的世界有个安稳的归宿。
在这里插入图片描述

Leetcode原题

338.比特位数

在这里插入图片描述

思路

方法一 动态规划

a[i]表示i的二进制中1的个数,那么bits[i-1]就是bits[i]拿掉一个1之后的值,i & (i - 1)就是去掉最低位的一个1。,因此 i & (i - 1)是比 i 小的,而且i & (i - 1)的1的个数已经在前面算过了,所以i的1的个数就是 i & (i - 1)的1的个数加上1

    public int[] countBits(int n) {
     int a[]=new int[n+1];
     for (int i=1;i<=n;i++){
         a[i] = a[i &(i-1)] +1;
     }
     return a;
    }

方法二 奇偶法

对于所有的数字,只有两类:

奇数:二进制表示中,奇数一定比前面那个偶数多一个 1,因为多的就是最低位的 1。

  举例: 
         0 = 0       1 = 1
         2 = 10      3 = 11

偶数:二进制表示中,偶数中 1 的个数一定和除以 2 之后的那个数一样多。因为最低位是 0,除以 2 就是右移一位,也就是把那个 0 抹掉而已,所以 1 的个数是不变的。

 举例:
         2 = 10       4 = 100       8 = 1000
         3 = 11       6 = 110       12 = 1100

另外,0 的 1 个数为 0,于是就可以根据奇偶性开始遍历计算了。

 //方法2: 奇偶法
    public int[]  countBits2(int n) {
        int a[]=new int[n+1];
        a[0] =0;

        for (int i = 1; i <=n ; i++) {
            if ((i&1) ==1){ //使用位运算判断奇偶数,等于1是奇数
                a[i] = a[i-1]+1;
                //二进制表示中,奇数一定比前面那个偶数多一个 1,因为多的就是最低位的 1
            }else {
                a[i] =a[i>>1];
                //二进制表示中,偶数中 1 的个数一定和除以 2 之后的那个数一样多。因为最低位是 0,除以 2 就是右移一位,也就是把那个 0 抹掉而已,所以 1 的个数是不变的。
            }
        }
        return  a;
    }

有兴趣的老爷,还可以关注我的公众号【一起收破烂】,回复【006】获取 最新java面试资料以及简历模型120套哦~
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

收破烂的小熊猫~

你的鼓励将是我创造最大的东西~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值