[LeetCode] Counting Bits 计算二进制表示法中1的位数

来源:互联网 发布:郑爽 不吃饭知乎 编辑:程序博客网 时间:2024/06/10 17:40

声明:原题目转载自LeetCode,解答部分为原创

Problem :

        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.

Solution :

         思路:最直接的想法是,遍历二进制表示数中的每一位,用一个count来记录 “1” 的位数,时间复杂度为O( n * sizeof(n) ),其中sizeof(n)表示n的二进制表示法的位数。更进一步,我们很容易发现,由于在考虑 n 的 “1”位数时,0 ~ n - 1的 “1”位数是已知的,所以自然而然地找寻 n 的 “1”位数与小于n的 “1”位数之间的联系。如二进制顺序数组 { 00, 01,10,11,100,101,110,111, ......},以 “110” 为例,可将其拆分成“1” 和 ”10”,故其“1”位数相当于 1 + “10”的 “1”位数。“10” 的 “1”位数已知,则 “110”的 “1”位数可以在常数时间内求出。

        代码如下:

#include<iostream>#include<vector>using namespace std;class Solution {public:    vector<int> countBits(int num) {        vector<int> bits_1;                if(num == 0)        {            bits_1.push_back(0);            return bits_1;        }        if(num == 1)        {            bits_1.push_back(0);            bits_1.push_back(1);            return bits_1;        }                bits_1.push_back(0);        bits_1.push_back(1);        int initial_size = 2;        int point = 0;        for(int i = 2; i <= num ; i ++)        {            bits_1.push_back(bits_1[point] + 1);            point = (point + 1) % initial_size;            if(point == 0)                initial_size *= 2;        }        return bits_1;    }};int main(){Solution text;vector<int> array;array = text.countBits(7);for(int i = 0 ; i < array.size() ; i ++){cout << array[i] << " ";}cout << endl;return 0;}


0 0
原创粉丝点击