美文网首页
统计数的二进制表示中1的个数

统计数的二进制表示中1的个数

作者: ccsexyz | 来源:发表于2016-03-18 01:15 被阅读0次

    题目:给定一个非负整数num,求0<=i<=num的每个整数的二进制数中一的个数

    很简单就能想到使用builtin函数求解,但是很不幸这个方案被ban掉了,并且要求我们要能在一次遍历中求出结果。仔细观察结果产生的规律,我们没有必要每一次求解都将整个整数的二进制位遍历一次,只需利用已经计算出的结果和改数的最高位即可计算出结果。比如对数10101而言,看除第一位外的数值为5,显然此时1的二进制表达中5的位数已经求出来了了,于是乎我们只需要将这个结果加上1就可以了。还有一个问题是如何方便的确定减数的大小。假定减数设定为s,则s必定为2的幂,则在s 至 2s - 1中间的数都应该减去s再查表中的结果,当循环计数器i等于2s时,则将s扩大一倍,直到循环结束。具体的C语言实现如下:

    int *countBits(int num, int *returnSize) {
        int *ret = malloc(sizeof(int) * (++num));
        ret[0] = 0;
        int begin = 0, sum = 1;
        for (int i = 1; i < num; i++) {
            if (i == sum) {
                begin = i;
                sum = 2 * i;
                ret[i] = 1;
            } else {
                int off = i - begin;
                if (off) {
                    ret[i] = 1 + ret[off];
                } else {
                    ret[i] = ret[off];
                }
            }
        }
        *returnSize = num;
        return ret;
    }
    

    相关文章

      网友评论

          本文标题:统计数的二进制表示中1的个数

          本文链接:https://www.haomeiwen.com/subject/weiclttx.html