1. 比特位计数算法解析
在计算机科学中,计算一个数字的二进制表示中1的个数是一个经典问题。这个问题看似简单,但在实际应用中却有着广泛的意义,比如在数据压缩、密码学和错误检测等领域都有重要应用。
1.1 问题定义与基础解法
给定一个非负整数n,对于0 ≤ i ≤ n中的每个数字i,计算其二进制表示中1的个数,并将结果以逗号分隔的字符串形式输出。例如,当n=5时,输出应为"0,1,1,2,1,1"。
最直观的解法是遍历0到n的每个数字,对每个数字进行如下操作:
- 初始化计数器为0
- 当数字不为0时:
- 检查最低位是否为1(通过num % 2)
- 如果是,计数器加1
- 将数字右移一位(相当于除以2)
- 将计数器结果存入结果字符串
1.2 代码实现分析
让我们仔细分析提供的C++代码实现:
cpp复制void 比特位计数() {
int n = 0, nn = 0, g = 0;
std::string s = "", z = "";
std::cin >> n;
nn = n;
fj:if (n) {
if (nn % 2)
++g;
if (nn)
nn /= 2;
else {
z = g + '0';
if (s == ""); else z += ",";
s = z + s, nn = --n, g = 0;
}
goto fj;
}
s = "0," + s;
printf("%s\n", s.c_str());
}
这段代码有几个值得注意的特点:
- 使用了goto语句实现循环(fj标签)
- 通过nn % 2检查最低位是否为1
- 使用字符串拼接构建结果
- 最后通过printf输出结果
注意:在实际开发中,应尽量避免使用goto语句,这会使代码难以理解和维护。可以使用while或for循环替代。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 算法优化与改进
2.1 性能优化思路
虽然上述解法可以正确解决问题,但在效率上还有提升空间。我们可以利用动态规划的思想来优化算法:
- 对于任意数字i,其1的个数等于i/2的1的个数加上i的最低位的1
- 即:count[i] = count[i >> 1] + (i & 1)
- 这样可以将时间复杂度从O(n*sizeof(int))降低到O(n)
2.2 优化后的实现
cpp复制std::vector<int> countBits(int n) {
std::vector<int> res(n+1, 0);
for(int i = 1; i <= n; ++i) {
res[i] = res[i >> 1] + (i & 1);
}
return res;
}
void 比特位计数_优化() {
int n;
