Rust语言编程实例100题-057
题目:LeetCode 练习 338. 比特位计数
给定一个非负整数 num。对于 0 ≤ i ≤ num 范围中的每个数字 i ,计算其二进制数中的 1 的数目并将它们作为数组返回。
程序分析:对于任意整数 x,令 x=x & (x−1),该运算将 xx 的二进制表示的最后一个 1变成 0。因此,对 x 重复该操作,直到 x 变成 0,则操作次数即为 x 的「一比特数」。对于给定的 n,计算从 0 到 n 的每个整数的「一比特数」的时间都不会超过 O(logn),因此总时间复杂度为O(nlogn)。
知识点:动态规划
参考程序代码:
fn main() {
let result = count_bits(5);
dbg!(result);
}
pub fn count_bits(n: i32) -> Vec<i32> {
let mut dp = vec![0; (n + 1) as usize];
for i in 1..=n as usize {
dp[i] = dp[i & (i - 1)] + 1;
}
return dp;
}
程序执行结果:
result = [
0,
1,
1,
2,
1,
2,
]