#include <iostream>
#include <stdio.h>
#include <vector>
#include <string>
using namespace std;
/*
问题:
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.
分析:题目是要求给定数num,中0~num的各个数1的位数,
举例:num=9
[0 , 1 , 1 , 2, 1 , 2, 2, 3, 1, 2]
bun = 16
[0 , 1 , 1 , 2, 1 , 2, 2, 3, 1, 2, 2, 3, 2 , 3, 3, 4, 1]
题目要求尽量在O(n)时间完成。
关键就是分析二进制进位的原理
输入:
5
输出:
0 1 1 2 1 2
参考这位的解法:http://blog.csdn.net/tstsugeg/article/details/50922112
1 从最低位的1着手。
1的个数=除了最低位的1的个数 + 最低位1的个数
除了最低位1的个数=将该数向右移动1位
result[i] = result[i >> 1] + i % 2;
*/
class Solution {
public:
vector<int> countBits(int num) {
vector<int> result(num + 1 , 0);
for(int i = 1 ; i <= num ; i++)
{
result.at(i) = result.at( (i >> 1)) + i % 2;
}
return result;
}
};
void print(vector<int>& result)
{
if(result.empty())
{
cout << "no result" << endl;
return;
}
int size = result.size();
for(int i = 0 ; i < size ; i++)
{
cout << result.at(i) << " " ;
}
cout << endl;
}
void process()
{
int num;
Solution solution;
vector<int> result;
while(cin >> num )
{
result = solution.countBits(num);
print(result);
}
}
int main(int argc , char* argv[])
{
process();
getchar();
return 0;
}
leecode 解题总结:338. Counting Bits
最新推荐文章于 2022-06-13 14:44:48 发布