leetcode简单题 -- 19.比特位计数

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

示例1:
	输入:n = 2
	输出:[0,1,1]
	解释:
	0 --> 0
	1 --> 1
	2 --> 10

示例2:
	输入:n = 5
	输出:[0,1,1,2,1,2]
	解释:
	0 --> 0
	1 --> 1
	2 --> 10
	3 --> 11
	4 --> 100
	5 --> 101

解题思路:
方法一:JS中的toString()方法。

  • 利用toString()方法将数字转为二进制的形式
  • 计算每个二进制中1的数量
/**
 - @param {number} n
 - @return {number[]}
 */
var countBits = function(n) {
    let res = []
    for(let i = 0; i <= n; i++){
        res.push((getOneNum(i.toString('2'))))
    }
    return res
};
// 计算num字符串中包含多少个1
function getOneNum(num){
    let count = 0
    for(let c of num){
        if(c === '1'){
            count++
        }
    }
    return count
}

方法二:Brian Kernighan 算法

  • Brian Kernighan 算法:用于清除二进制数中最右侧的1。做法:x = x & (x - 1)。例如x = 20, 二进制为10100,x-1的二进制为10011,则x & (x -1) = 10000,将x中最右侧的1清除掉了。
/**
 * @param {number} n
 * @return {number[]}
 */
var countBits = function(n) {
    let res = []
    for(let i = 0; i <= n; i++) {
        res.push(getOneNum(i))
    }
    return res
};
function getOneNum(num){
    let res = 0
    while(num > 0){
        num = num & (num - 1)
        res += 1
    }
    return res
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值