LeetCode-338. 比特位计数

给定一个非负整数 num。对于 0 ≤ i ≤ num 范围中的每个数字 i ,计算其二进制数中的 1 的数目并将它们作为数组返回。

示例 1:

输入: 2
输出: [0,1,1]
示例 2:

输入: 5
输出: [0,1,1,2,1,2]
进阶:

给出时间复杂度为O(n*sizeof(integer))的解答非常容易。但你可以在线性时间O(n)内用一趟扫描做到吗?
要求算法的空间复杂度为O(n)。
你能进一步完善解法吗?要求在C++或任何其他语言中不使用任何内置函数(如 C++ 中的 __builtin_popcount)来执行此操作。

没理解题意,看此表,列举到num的范围中的每个数字 i 的1的个数。

0    0000    0
-------------
1    0001    1
-------------
2    0010    1
3    0011    2
-------------
4    0100    1
5    0101    2
6    0110    2
7    0111    3
-------------
8    1000    1
9    1001    2
10   1010    2
11   1011    3
12   1100    2
13   1101    3
14   1110    3
15   1111    4

#include<iostream>
#include<stdio.h>
#include<vector>
using namespace std;

/*
   思路:
   每次 & 1 操作之后右移1位,计算每次的次数即可
*/


class Solution {
public:
	vector<int> countBits(int num) {
		vector<int> res;
		for (int i = 0; i <= num; i++) {
			int calc = 0;
			int tmp = i;
			while (tmp) {
				calc = (tmp & 1) + calc;
				tmp = tmp >> 1;
			}
			res.push_back(calc);
		}
		return res;
	}
};
int main() {
	Solution* ps = new Solution();
	vector<int>res = ps->countBits(5);
	for (int i = 0; i < res.size(); i++) {
		cout << "res:" << res[i] << endl;
	}

	system("pause");
	return 0;
}
发布了245 篇原创文章 · 获赞 57 · 访问量 36万+

猜你喜欢

转载自blog.csdn.net/qq_16542775/article/details/103961602