1. 程式人生 > >LeetCode-762. Prime Number of Set Bits in Binary Representation

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;
    }
}