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

来源:互联网 发布:郑爽 不吃饭知乎 编辑:程序博客网 时间:2024/09/21 08:44

声明:原题目转载自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
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 cpu铜触点掉落怎么办 商场没人气商户怎么办 58会员账号冻结怎么办 58账号冻结资金怎么办 超市买过期东西怎么办 淘宝没发货退款怎么办 申请退款发货了怎么办 51微投票异常怎么办 信用卡逾期收到律师函怎么办 淘宝商品被模仿怎么办 电脑数字间距大怎么办 有源码没有模块怎么办 花盆里有爬虫怎么办 家里有长条爬虫怎么办 有了网站源码后怎么办 第五人格闪退怎么办 超市买东西多收钱怎么办 王者荣耀换系统怎么办 夹娃娃夹子松怎么办 天猫魔盒遥控器没了怎么办 合约机被骗了怎么办 二手苹果合约机怎么办 手机系统老化了怎么办 手机显示电池老化怎么办 手机移动数据打不开怎么办 武汉移动大王卡怎么办 红米手机卡死了怎么办 红米手机死机怎么办 红米note5装卡大怎么办 手机卡二不显示怎么办 小米手机声音小怎么办 小米4手机屏幕失灵怎么办 安装包证书异常怎么办 安装包出现异常怎么办 红米手机按键失灵怎么办 红米手机内存不足怎么办 红米note2内存不足怎么办 信号强度-98dbm怎么办 小米mix2误触怎么办 指纹功能不能用怎么办 红米手机中毒怎么办