比特位计数

给你一个整数 n ,对于 0 <= i <= n 中的每个 i ,计算其二进制表示中 1 的个数 ,返回一个长度为 n + 1 的数组 ans 作为答案。

/**

  • 奇偶数计算二进制中1的个数:
  • 1.偶数在二进制中最低位为0,所以偶数二进制中1的个数应该与该数/2后1的个数相当
  • 2.奇数比前一个相邻的偶数多了1,即二进制最低位为1,1的个数比前一个相邻偶数多1
    */
    想到这个,该题就很简单
/**
 * 奇偶数计算二进制中1的个数:
 * 1.偶数在二进制中最低位为0,所以偶数二进制中1的个数应该与该数/2后1的个数相当
 * 2.奇数比前一个相邻的偶数多了1,即二进制最低位为1,1的个数比前一个相邻偶数多1
 */
class Solution {
    public int[] countBits(int n) {
        int[] num = new int[n+1];
        //num[0]==0
        int i = 1;
        while(i <= n){
            if ((i & 1) ==1)//i为奇数时
                num[i] = num[i-1] + 1;
            else
                num[i] = num[i>>1];//即偶数/2向右移动一位
            i++;//写while时先写出,需修改时修改,以防忘记

            //看到有大佬写的更简便,如下
            //num[i] = num[i>>1] + (i & 1);
            //i++;
        }
        return num;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值