比特位计数

题目描述:

给定一个非负整数 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

 

small_lei_it 技术无止境,追求更高。
原文地址:https://www.cnblogs.com/smallleiit/p/13575622.html