题目
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 1
s 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:
-
L, R
will be integersL <= R
in the range[1, 10^6]
. -
R - L
will be at most 10000.
讲解
这一题同样是针对二进制表示进行出题,题目的意思是计算一个数的二进制表示中有多少个1,如果是素数个1,结果就加一。性能的提升点应该是在 isPrime
函数的实现上。我采用的是最普通的方法,从2到$\sqrt x$进行累加,判断x是否是素数,效率比较低。
java代码
class Solution {
public int countPrimeSetBits(int L, int R) {
int result = 0;
for(int i=L;i<=R;i++){
int temp = i;
int count = 0;
while(temp>0){
if(temp%2==1){
count++;
}
temp >>= 1;
}
if(isPrime(count)){
result++;
}
}
return result;
}
private boolean isPrime(int a){
if(a<=1){
return false;
}
for(int i=2;i<=Math.sqrt(a);i++){
if(a%i==0){
return false;
}
}
return true;
}
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。