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:

1
2
3
4
5
6
7
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:

1
2
3
4
5
6
7
8
9
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.

分析


乍一看,用暴力法就能解决,其实不用那么麻烦,R 最大不会超过 $10^6$,而 $2^20 = 1048576$,也就是说这个范围内的数字转换为二进制表示后,1的数量不会超过20,20以内的质数有 2, 3, 5, 7, 11, 13, 17, 19,判断二进制表示后的1的数量是否为这些数字即可。

解决方案1(Java)


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
class Solution {
public int countPrimeSetBits(int L, int R) {
int result = 0;
for (int i = L; i <= R; i++) {
if (isPrime(Integer.bitCount(i))) {
result++;
}
}
return result;
}

private boolean isPrime(int n) {
if (n <= 1) {
return false;
}
if (n == 2) {
return true;
}
for (int i = 2; i <= (int)Math.sqrt(n); i++) {
if (n % i == 0) {
return false;
}
}
return true;
}
}

解决方案2(Java)


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Solution {
public int countPrimeSetBits(int L, int R) {
int result = 0;
for (int i = L; i <= R; i++) {
if (is20Prime(Integer.bitCount(i))) {
result++;
}
}
return result;
}

private boolean is20Prime(int n) {
return (n == 2 || n == 3 || n == 5 || n == 7 || n == 11 || n == 13 || n == 17 || n == 19);
}
}

相关问题


(E) Number of 1 Bits

题目来源