1. 程式人生 > >338. Counting Bits(python+cpp)

338. Counting Bits(python+cpp)

題目:

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 1:

Input: 2 
Output: [0,1,1]

Example 2:

Input: 5 
Output: [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.

解釋:
用動態規劃做:
如果i是偶數,那麼i中1的個數和i/2中1的個數是一樣的
如果i是奇數,那麼i中1的個數和i/2中1的個數+1。
所以主要問題就是判斷i的奇偶性,可以用i&1來判斷
用位運算比用除法速度快。
python程式碼:

class Solution(object):
    def countBits(self, num):
        """
        :type num: int
        :rtype: List[int]
        """
        result=[0]
        for i in xrange(1,
num+1): result.append(result[i>>1]+(1&i)) return result

c++程式碼:

class Solution {
public:
    vector<int> countBits(int num) {
        vector<int> result={0};
        for (int i=1;i<=num;i++)
        {
            result.push_back(result[i>>1]+(i&
1)); } return result; } };

總結:
位移運算比乘除法速度更快。