剑指 - 简单计算每个整数的二进制形式中1的个数(Swift)

37 阅读1分钟

题目

输入一个非负数n,请计算0到n之间每个数字的二进制形式中1的个数,并输出一个数组。例如,输入的n为4,由于0、1、2、3、4的二进制形式中1的个数分别为0、1、1、2、1,因此输出数组[0,1,1,2,1]。

解题思路

  • 异常情况:负数直接返回。
  • 遍历条件,从 1 到 n。初始化的结果数组的容量应为 n + 1,因为是从 0 开始计算的。
  • 每个数字的二进制 1 的数量计算公式为 count( i) = count (i & i - 1) + 1

实现代码

class StatisticOneCount {
    static func statisticOneCount(_ num: Int) -> [Int] {
        if num < 0 {
            return []
        }
        
        var result = Array(repeating: 0, count: num + 1)
        for number in 1...num {
            result[number] = result[number & (number - 1)] + 1
        }
        return result
    }
}