zoukankan      html  css  js  c++  java
  • 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 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.

    Approach #1: Math. [C++]

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

      

    Analysis:

    i     binary      count     i&(i-1)

    0  0         0  

    1  0001   1      0000  ->  0

    2  0010   1      0000  0

    3  0011   2      0010  2

    4  0100   1      0000  0  

    5  0101      2      0100  4

    6  0110   2      0100  4

    7  0111   3      0110   6

    8  1000   1      0000  0

    We can find some regular about:

    the count of '1' in the i(binary) = the count of '1' in the i&(i-1)(binary) + 1;

    temp[i] = temp[i&(i-1)] + 1;

    Approach #2: bitset. [C++]

    class Solution {
    public:
        vector<int> countBits(int num) {
            vector<int> res;
            for (int i = 0; i <= num; ++i) {
                res.push_back(bitset<32>(i).count());
            }
            return res;
        }
    };
    

      

    Analysis:

    There is a trick of the function bitset. Using this function we can directly calculate the number of '1' in the i's binary form.

    Reference:

    http://www.cplusplus.com/reference/bitset/bitset/count/

    http://www.cnblogs.com/grandyang/p/5294255.html

    永远渴望,大智若愚(stay hungry, stay foolish)
  • 相关阅读:
    【整理】close 和 shutdown 的原理
    【理解】 Error 10053和 Error 10054
    【转载】 socket recv 和 read
    【转载】socket 的 connect、listen、accept 和全连接队列、半连接队列的原理
    【原创】MySQL 生产环境备份还原
    【原创】【问题记录】系统管理员设置了系统策略,禁止此安装的最终解决办法
    【原创】rabbitmq 学习
    mvc, web mvc, spring web mvc 区别
    Spring 读取配置文件的俩种方式
    移动端web开发技巧和常见问题
  • 原文地址:https://www.cnblogs.com/h-hkai/p/10389412.html
Copyright © 2011-2022 走看看