• LeetCode算法题-Prime Number of Set Bits in Binary Representation(Java实现)


    这是悦乐书的第311次更新,第332篇原创

    01 看题和准备

    今天介绍的是LeetCode算法题中Easy级别的第180题(顺位题号是762)。给定两个正整数L和R,在[L,R]范围内,计算每个整数的二进制数中1的个数,判断1的个数是否是一个素数。例如,21的二进制数是10101,其中1的个数有3个,3是一个素数。例如:

    输入:L = 6,R = 10

    输出:4

    说明:

    6 --> 110(2个1,2是素数)

    7 --> 111(3个1,3是素数)

    9 --> 1001(2个1,2是素数)

    10 --> 1010(2个1,2是素数)

    输入:L = 10,R = 15

    输出:5

    说明:

    10 --> 1010(2个1,2是素数)

    11 --> 1011(3个1,3是素数)

    12 --> 1100(2个1,2是素数)

    13 --> 1101(3个1,3是素数)

    14 --> 1110(3个1,3是素数)

    15 --> 1111(4个1,4不是素数)


    注意

    • L,R是[1,10 ^ 6]范围内的整数,并且L小于等于R.

    • R减L的差最多为10000。

    本次解题使用的开发工具是eclipse,jdk使用的版本是1.8,环境是win7 64位系统,使用Java语言编写和测试。

    02 第一种解法

    第一步,需要先计算出整数的二进制数中1的个数,借助包装类Integer的bitCount方法来完成。

    第二步,判断第一步获取的1的个数是否是一个素数,通过一个辅助方法来实现,如果是素数,计数count加1。

    public int countPrimeSetBits(int L, int R) {
        int count = 0;
        for (int i=L; i<=R; i++) {
            int cnt = Integer.bitCount(i);
            if (isPrime(cnt)) {
                count++;
            }
        }    
        return count;
    }
    
    /**
     * 素数:只能被1和自身整除。
     * @param n
     * @return
     */
    public boolean isPrime(int n) {
        if (n <= 3) {
            return n > 1;
        }
        for (int i=2; i<=Math.sqrt(n); i++) {
           if (n%i == 0) {
               return false;
           }
        }
        return true;
    }
    

    03 第二种解法

    题目给定了L和R的范围,最大为1000000,而1000000的二进制数为11110100001001000000,其长度为20,也就是在题目给定的范围内,任意整数的二进制数中1的个数不会超过20个,而1到20内的素数只包含{2,3,5,7,11,13,17,19}这8个,我们只用判断是否是这8个数中的一个即可。

    public int countPrimeSetBits2(int L, int R) {
        int count = 0;
        for (int i=L; i<=R; i++) {
            int cnt = Integer.bitCount(i);
            if (cnt == 2 || cnt == 3 || cnt == 5 || cnt == 7 ||
                cnt == 11 || cnt == 13 || cnt == 17 || cnt == 19) {
                count++;
            }
        }    
        return count;
    }
    

    04 第三种解法

    和第二种解法的思路类似,将20个数变成布尔类型的数组,计算出二进制数中1的个数当做数组的下标去匹配。

    public int countPrimeSetBits3(int L, int R) {
        int count = 0;
        boolean[] arr = { false, false, true, true, false, 
            true, false, true, false, false, false, true, 
            false, true,false, false, false, true, false, true };
        for (int i = L; i <= R; i++) {
            int cnt = Integer.bitCount(i);
            if (arr[cnt]) {
            	count++;
            }
        }
        return count;
    }
    

    05 小结

    算法专题目前已日更超过五个月,算法题文章180+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。

    以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!

  • 相关阅读:
    解除对80端口的占用
    php排序算法
    Jquery异步请求数据实例
    C# winform 递归选中TreeView子节点
    C# WinFrom 编写正则表达式验证类
    c# winfrom 委托实现窗体相互传值
    [转]我的第一个WCF
    计算字符串中子串出现的次数
    JQuery中的html(),text(),val()区别
    Crystal Report制作使用
  • 原文地址:https://www.cnblogs.com/xiaochuan94/p/10743031.html
Copyright © 2020-2023  润新知