题目描述:
给定一个非负整数 num。对于 0 ≤ i ≤ num 范围中的每个数字 i ,计算其二进制数中的 1 的数目并将它们作为数组返回。
示例1:
输入: 2 输出: [0,1,1]
示例2:
输入: 5 输出: [0,1,1,2,1,2]
解题思路:
首先计算二进制数中的 1 的数目,我们就应该自然想到用「位运算」
i & (i - 1)可以去掉i最右边的一个1(如果有),因此 i & (i - 1)是比 i 小的,而且i & (i - 1)的1的个数已经在前面算过了,所以i的1的个数就是 i & (i - 1)的1的个数加上1
代码:
//go func countBits(num int) []int { res := make([]int, num+1) //初始化了res[0] = 0 for i:=1; i <= num; i++ { //注意要从1开始,0不满足 res[i] = res[i & (i-1)] + 1 } return res }
地址:https://mp.weixin.qq.com/s/GvPAIhQ9saFByOLs-M4JNA