• 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+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。

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

  • 相关阅读:
    SPOJ GSS4 Can you answer these queries IV ——树状数组 并查集
    SPOJ GSS3 Can you answer these queries III ——线段树
    SPOJ GSS2 Can you answer these queries II ——线段树
    SPOJ GSS1 Can you answer these queries I ——线段树
    BZOJ 2178 圆的面积并 ——Simpson积分
    SPOJ CIRU The area of the union of circles ——Simpson积分
    HDU 1724 Ellipse ——Simpson积分
    HDU 1071 The area ——微积分
    HDU 4609 3-idiots ——FFT
    BZOJ 2194 快速傅立叶之二 ——FFT
  • 原文地址:https://www.cnblogs.com/xiaochuan94/p/10743031.html
Copyright © 2020-2023  润新知