算法练习(24):Counting Bits

来源:互联网 发布:培训交互设计师知乎 编辑:程序博客网 时间:2024/05/01 16:06

题意:输入一个数,然后找出小于等于它的每个非负整数的二进制形式的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;}};


原创粉丝点击