LeetCode-762. Prime Number of Set Bits in Binary Representation

Given two integers L and R, find the count of numbers in the range [L, R] (inclusive) having a prime number of set bits in their binary representation.

(Recall that the number of set bits an integer has is the number of 1s present when written in binary. For example, 21 written in binary is 10101 which has 3 set bits. Also, 1 is not a prime.)

Example 1:

Input: L = 6, R = 10
Output: 4
Explanation:
6 -> 110 (2 set bits, 2 is prime)
7 -> 111 (3 set bits, 3 is prime)
9 -> 1001 (2 set bits , 2 is prime)
10->1010 (2 set bits , 2 is prime)

Example 2:

Input: L = 10, R = 15
Output: 5
Explanation:
10 -> 1010 (2 set bits, 2 is prime)
11 -> 1011 (3 set bits, 3 is prime)
12 -> 1100 (2 set bits, 2 is prime)
13 -> 1101 (3 set bits, 3 is prime)
14 -> 1110 (3 set bits, 3 is prime)
15 -> 1111 (4 set bits, 4 is not prime)

Note:

  1. L, R will be integers L <= R in the range [1, 10^6].
  2. R - L will be at most 10000.

从一般逻辑来看,解决这道题的步骤如下:

1.遍历[L,R],将当前值记为i

2.将i转化成二进制,并统计1的个数,记为num

3.判断num是否为素数,如是count++

class Solution {
    public int countPrimeSetBits(int L, int R) {
        int count=0;
		for(int i=L;i<=R;i++) {
			String s=Integer.toBinaryString(i);
			//System.out.println(s);
			int num=0;
			for(int k=0;k<s.length();k++)
				if(s.charAt(k)=='1')num++;
			//System.out.println(num);
			boolean flag=true;
			if(num==0||num==1) {
				continue;
			}
			if(num==2) {
				count++;
				continue;
			}
			for(int j=2;j<Math.sqrt(num)+1;j++) {
				if(num%j==0) {
					flag=false;
					break;
				}
			}
			if(flag)count++;
		}
		return count;
    }
}
以上代码使用了Integer自带的二进制转换函数
Integer.toBinaryString(i);

除了扫描二进制字符串以外,统计bit为1的方法还有

 for (int n = i; n > 0; n >>= 1)
                bits += n & 1;

实际上Integer还提供了一个函数,可以统计bit数为1的个数

int num=Integer.bitCount(i);

进一步想,R≤10^​6​​ <2^​20,因此num<20的,我们只需要列出20一列的素数,将其与num对比,可以大大加快判断时间。

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


猜你喜欢

转载自blog.csdn.net/ZHOUBEISI/article/details/79415853