leecode 解题总结:338. Counting Bits

#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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值