Leetcode338-比特位计数

Leetcode338-比特位计数

//给定一个非负整数 num。对于 0 ≤ i ≤ num 范围中的每个数字 i ,计算其二进制数中的 1 的数目并将它们作为数组返回。 
//
// 示例 1: 
//
// 输入: 2
//输出: [0,1,1] 
//
// 示例 2: 
//
// 输入: 5
//输出: [0,1,1,2,1,2] 
//
// 进阶: 
//
// 
// 给出时间复杂度为O(n*sizeof(integer))的解答非常容易。但你可以在线性时间O(n)内用一趟扫描做到吗? 
// 要求算法的空间复杂度为O(n)。 
// 你能进一步完善解法吗?要求在C++或任何其他语言中不使用任何内置函数(如 C++ 中的 __builtin_popcount)来执行此操作。 
// 
// Related Topics 位运算 动态规划 
// 👍 517 👎 0





//******************************************直接暴力*****************************************
//leetcode submit region begin(Prohibit modification and deletion)
class Solution {
    public int[] countBits(int num) {
        int[] ans=new int[num+1];


        for(int i=1;i<=num;i++){
            int temp=i;
            if(temp==0){
                ans[i]=0;
            }else {
                while (temp != 0) {
                    if (temp % 2 == 1) ans[i]++;
                    temp /= 2;
                }
            }
        }
        return ans;

    }
}
//leetcode submit region end(Prohibit modification and deletion)

另一种暴力运用位运算:按位与运算(&)的一个性质是:对于任意整数x,令x&(x-1),该运算将x的二进制表示的最后一个1变成0.因此,对x重复操作,直到x变成0,则操作次数即为x的比特数

class Solution {
    public int[] countBits(int num) {
        int[] bits = new int[num + 1];
        for (int i = 0; i <= num; i++) {
            bits[i] = countOnes(i);
        }
        return bits;
    }

    public int countOnes(int x) {
        int ones = 0;
        while (x > 0) {
            x &= (x - 1);
            ones++;
        }
        return ones;
    }
}
//维护最高位
class Solution {
    public int[] countBits(int num) {
        int[] bits=new int[num+1];
        int highBit=0;
        for(int i=1;i<=num;i++){
            if((i&(i-1))==0){
                highBit=i;
            }
            bits[i]=bits[i-highBit]+1;
        }
        return bits;
    }
}
//动态规划--最低有效位
class Solution {
    public int[] countBits(int num) {
        int[] bits=new int[num+1];
		for(int i=1;i<=num;i++){
            bits[i]=bits[i>>1]+(i&1);
        }
        return bits;
    }
}
//最低设置位
class Solution {
    public int[] countBits(int num) {
        int[] bits=new int[num+1];
		for(int i=1;i<=num;i++){
            bits[i]=bits[i&(i-1)]+1;
        }
        return bits;
    }
}
已标记关键词 清除标记
相关推荐
<p> <b><span style="font-size:14px;"></span><span style="font-size:14px;background-color:#FFE500;">【Java面试宝典】</span></b><br /> <span style="font-size:14px;">1、68讲视频课,500道大厂Java常见面试题+100个Java面试技巧与答题公式+10万字核心知识解析+授课老师1对1面试指导+无限次回放</span><br /> <span style="font-size:14px;">2、这门课程基于胡书敏老师8年Java面试经验,调研近百家互联网公司及面试官的问题打造而成,从筛选简历和面试官角度,给出能帮助候选人能面试成功的面试技巧。</span><br /> <span style="font-size:14px;">3、通过学习这门课程,你能系统掌握Java核心、数据库、Java框架、分布式组件、Java简历准备、面试实战技巧等面试必考知识点。</span><br /> <span style="font-size:14px;">4、知识点+项目经验案例,每一个都能做为面试的作品展现。</span><br /> <span style="font-size:14px;">5、本课程已经在线下的培训课程中经过实际检验,老师每次培训结束后,都能帮助同学们运用面试技巧,成功找到更好的工作。</span><br /> <br /> <span style="font-size:14px;background-color:#FFE500;"><b>【超人气讲师】</b></span><br /> <span style="font-size:14px;">胡书敏 | 10年大厂工作经验,8年Java面试官经验,5年线下Java职业培训经验,5年架构师经验</span><br /> <br /> <span style="font-size:14px;background-color:#FFE500;"><b>【报名须知】</b></span><br /> <span style="font-size:14px;">上课模式是什么?</span><br /> <span style="font-size:14px;">课程采取录播模式,课程永久有效,可无限次观看</span><br /> <span style="font-size:14px;">课件、课程案例代码完全开放给你,你可以根据所学知识,自行修改、优化</span><br /> <br /> <br /> <span style="font-size:14px;background-color:#FFE500;"><strong>如何开始学习?</strong></span><br /> <span style="font-size:14px;">PC端:报名成功后可以直接进入课程学习</span><br /> <span style="font-size:14px;">移动端:<span style="font-family:Helvetica;font-size:14px;background-color:#FFFFFF;">CSDN 学院APP(注意不是CSDN APP哦)</span></span> </p>
©️2020 CSDN 皮肤主题: 1024 设计师:白松林 返回首页