题目
代码实现:
//方法一:
func countBits(num int) []int {
arr := make([]int,num+1)
for i:=1;i <= num;i++{
if i&1 == 1{
arr[i] = arr[i-1]+1
}else{
arr[i]=arr[i/2]
}
}
return arr
}
解题思路:奇数的1个数是偶数+1,偶数个数是除以2的奇数的1的个数。
举例
0 = 0 1 = 1
2 = 10 3 = 11
2 = 10 4 = 100 8 = 1000
3 = 11 6 = 110 12 = 1100
作者:duadua
链接:https://leetcode-cn.com/problems/counting-bits/solution/hen-qing-xi-de-si-lu-by-duadua/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
//方法二:
func countBits(num int) []int {
arr:=make([]int,num+1)
for i:=1;i<=num;i++{
arr[i]=arr[i&(i-1)]+1
}
return arr
}
解题思路:利用位运算 i & (i - 1) 可以去掉i最右边的一个1(如果有),因此 i & (i - 1)是比 i 小,而且i & (i - 1)的1的个数已经在前面算过了,所以i的1的个数就是 i & (i - 1)的1的个数加上1。