前 n 个数字二进制中 1 的个数 —— 位运算

80 阅读1分钟

image.png

代码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
}