338 Counting Bits

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

class Solution {
public:
    vector<int> countBits(int num) {
        vector<int> result;
        if ( num <= -1 ) return result;
        result.push_back(0);
        if ( num == 0 ) return result;
        for ( int i = 1; i <= num; i++ ) {
            if ( i%2 == 0 ) result.push_back(result[i/2]);
            else result.push_back(result[(i-1)/2] + 1);
        }
        return result;
    }
};

Notes

  • for an even number i, the number of digit 1 is the same as in (i/2)
    • e.g. 14 (1110) vs. 7 (111)
  • for an odd number i, the number of digit 1 equals to the number of digit one in (i-1)/2 plus one.
    • e.g. 15 (1111) vs. 7(111)

results matching ""

    No results matching ""