题意:输入一个数,然后找出小于等于它的每个非负整数的二进制形式的1的个数,用vector依次存下来返回
分析与思路:这道题,我是先列出很多个数以及它的1个数来找规律的,因为这种题若要求O(n)则肯定是找数字规律的,列出的数字如下:
如上所示,除开0和1,每一个2的幂之间都有规律,【2^k,2^(k+1))的前半部分是和【2^(k-1),2^k)一样的,而后半部分则为【2^(k-1),2^k)的对应项加一。所以很容易可以得出思路。
代码:
class Solution {
public:
vector<int> countBits(int num) {
if (num == 0) return vector<int> {0};
vector<int> re{ 0,1 };
int k = 1,i = 2;
while (i <= num) {
for (i = pow(2, k); i < pow(2, k + 1); i++) {
if (i <= num) {
if (i < (pow(2, k + 1) - pow(2, k)) / 2 + pow(2, k)) {
re.push_back(re[i - (pow(2, k + 1) - pow(2, k)) / 2]);
}//前半部分
else {
re.push_back(re[i - (pow(2, k + 1) - pow(2, k)) / 2]+1);
}//后半部分
}
else break;
}
k++;
}
return re;
}
};
本文介绍了一种高效算法,用于计算从0到指定整数范围内每个数的二进制表示中1的个数,并使用C++实现。通过观察规律发现,每两个连续的2的幂之间的数字具有相似性,这一特性使得算法能够在O(n)的时间复杂度内完成任务。
2064

被折叠的 条评论
为什么被折叠?



