Difficulty: Medium
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.
解法一:使用bitset中的count函数,总的时间复杂度为O(n*m),m为数字个数
#include <iostream>
#include <string>
#include <vector>
#include <stdlib.h>
#include <stdio.h>
#include <bitset>
using namespace std;
class Solution {
public:
vector<int> countBits(int num) {
vector<int> res;
for(int i=0;i<=num;i++)
{
int cnt=bitset<32>(i).count();
res.push_back(cnt);
}
return res;
}
};
解法二:不断地模2来取得每一位的数字,然后使用cnt来计数,
总的时间复杂度为
O(n*m),m为数字个数
<pre name="code" class="cpp">vector<int> countBits(int num) {
vector<int> res;
for(int i=0;i<=num;i++)
{
int cnt=0;
int tmp=i;
while(tmp)
{
int bit=tmp%2;
if(bit == 1) cnt++;
tmp=tmp/2;
}
res.push_back(cnt);
}
return res;
}
一开始想使用itoa()函数,但是发现出现了以下错误
- 有些编译器不支持itoa,因为它不是标准的。
- 解决方法
- c++11: std::to_string
- sprintf
- stdio.h
char *c = new char;
sprintf(c,"%d",num);
- stringstream
- sstream.h
stringstream ss; int x = 1;
ss << x;
string str = ss.str();