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

久未见 提交于 2020-01-22 07:55:25

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

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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!