题目
输入一个非负数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
}
}