第一次写博客各种一脸懵逼(:зゝ∠)
格式比较丑也懒得改了希望最好不要有同学戳进来!
根据老师大人的旨意我等渣渣要带着自己的渣代码出来丢人现眼了…
这星期刷的题目比较水,随意从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;
}
};