代码1 :
go 自带的 api
func countBits(n int) []int {
ans := make([]int, n+1)
for i := 0; i <= n; i++ {
ans[i] = bits.OnesCount(uint(i))
}
return ans
}
代码2 :
让 n 与 (n-1) 进行与运算,每一次运算可以将最后一个 1 转为 0,故而运算的个数即 1 的个数
func countBits(n int) []int {
ans := make([]int, n+1)
for i := 0; i <= n; i++ {
ans[i] = onsCount(i)
}
return ans
}
func onsCount(n int) (ones int) {
for ; n > 0; n &= (n-1) {
ones++
}
return ones
}
代码3:
动态规划,最高有效位
func countBits(n int) []int {
bits := make([]int, n+1)
highBit := 0
for i := 1; i <= n; i++ {
if i&(i-1) == 0 {
highBit = i
}
bits[i] = bits[i-highBit] + 1
}
return bits
}
代码4:
最低有效位:
func countBits(n int) []int {
ans := make([]int, n+1)
for i := 1; i <= n; i++ {
ans[i] = ans[i>>1] + 1&i
}
return ans
}
代码5:
最低设置位
func countBits(n int) []int {
bits := make([]int, n+1)
for i := 1; i <= n; i++ {
bits[i] = bits[i&(i-1)] + 1
}
return bits
}