Leetcode 338.Counting Bits

第一次写博客各种一脸懵逼(:зゝ∠)
格式比较丑也懒得改了希望最好不要有同学戳进来!
根据老师大人的旨意我等渣渣要带着自己的渣代码出来丢人现眼了…

这星期刷的题目比较水,随意从leetcode上medium难度的题挑了一道练练手

题目如下:
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.

解题思路:
由二进制的规律可得
0-00
1-01
2-10
3-11
4-100
5-101
6-110
7-111
可以看出从4-7的二进制数, 前半部分也就是4和5两个数字是将2和3的第一位变成0再在前面加上1,因此4,5的二进制数的1的个数和2,3相同
同时6和7是直接在2,3最前面加上1,因此6,7的二进制数的1的个数比2和3分别多1
由此我们可以看出规律
对[2^n, 2^(n+1))区间的数字,前半部分的二进制值中1的个数和[2^(n-1), 2^n)相同,而后半部分是[2^(n-1), 2^n)中每个元素的值+1.

—–贴个代码
输入:num
输出:从0到num所有数对应二进制数中1的位数组成的向量

Source Code

@requires_authorization
class Solution {
public:
    vector<int> countBits(int num) {
        vector<int> bits_array(num+1); 
        bits_array[0] = 0; 
        if(num == 0) return bits_array; 
        bits_array[1] = 1;  
        if(num == 1) return bits_array; 

        int left = 1, right = 2; /*从2,3开始*/
        int i = 0, middle = 0, j = 0; 
        while(i <= num) {
            i = pow((int)2, (int)left); 
            j = pow((int)2, (int)right); 
            middle = (i + j) / 2; 
            for(int inner = i; inner < middle && inner <= num; inner++) {
                bits_array[inner] = bits_array[inner-pow((int)2, (int)(left-1))]; 
            }
            for(int inner = middle; inner < j && inner <= num; inner++) {
                bits_array[inner] = bits_array[inner-pow((int)2, (int)(left-1))] + 1; 
            }
            left += 1; 
            right = left + 1; 
        }
        return bits_array; 
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值