Given a non negative integer number num. For every numbers i in the range 0 ≤ i ≤ num calculate the number of 1's in their binary representation and return them as an array.
Example:
For num = 5
you should return [0,1,1,2,1,2]
.
Follow up:
- It is very easy to come up with a solution with run time O(n*sizeof(integer)). But can you do it in linear time O(n) /possibly in a single pass?
- Space complexity should be O(n).
- Can you do it like a boss? Do it without using any builtin function like __builtin_popcount in c++ or in any other language.
递归第一题!
思路: 0-num 一次从小到大保存;
注意的是5对应2进制 101
1对应2进制 001
所以:count(a) = count(a - 小于a的最大的2的整数次幂) + 1;
判断一个数为2的整数次幂:
使用tmp = num&0x01----> num >>= 1;
考虑2进制,整数次幂只有首位为1其余都为0.所以sum(tmp)<2即为2的整数次幂!
class Solution {
public:
int count(int num, vector<int> a)
{
if (num == 0)
return 0;
int count = 0;
int tmp = num;
int i = 0;
while (tmp > 0)
{
if (tmp & 0x01)
count ++;
tmp >>= 1;
i ++;
}
if(count < 2)
return 1;//2的整数次幂
num = num - pow(2, i-1);
return a[num] + 1;
}
vector<int> countBits(int num) {
vector<int> rel;
for (int i = 0; i <= num; i ++)
{
//cout << i << endl;
rel.push_back(count(i, rel));
}
return rel;
}
};
public:
int count(int num, vector<int> a)
{
if (num == 0)
return 0;
int count = 0;
int tmp = num;
int i = 0;
while (tmp > 0)
{
if (tmp & 0x01)
count ++;
tmp >>= 1;
i ++;
}
if(count < 2)
return 1;//2的整数次幂
num = num - pow(2, i-1);
return a[num] + 1;
}
vector<int> countBits(int num) {
vector<int> rel;
for (int i = 0; i <= num; i ++)
{
//cout << i << endl;
rel.push_back(count(i, rel));
}
return rel;
}
};
遗憾的是:居然时间很高。。。找了个简单的= =
-
- class Solution {
- public:
- vector<int> countBits(int num) {
- vector<int> ret(num+1, 0);
- for(int i=1; i<=num; ++i)
- ret[i] = ret[i>>1] + i%2;
- return ret;
- }
- };