1. 程式人生 > 其它 >LeetCode——762. 二進位制表示中質數個計算置位(三種方法,瘋狂改善)

LeetCode——762. 二進位制表示中質數個計算置位(三種方法,瘋狂改善)

給定兩個整數 L 和 R ,找到閉區間 [L, R] 範圍內,計算置位位數為質數的整數個數。

(注意,計算置位代表二進位制表示中1的個數。例如 21 的二進位制表示 10101 有 3 個計算置位。還有,1 不是質數。)

示例 1:

輸入: L = 6, R = 10
輸出: 4
解釋:
6 -> 110 (2 個計算置位,2 是質數)
7 -> 111 (3 個計算置位,3 是質數)
9 -> 1001 (2 個計算置位,2 是質數)
10-> 1010 (2 個計算置位,2 是質數)
示例 2:

輸入: L = 10, R = 15
輸出: 5
解釋:
10 -> 1010 (2 個計算置位, 2 是質數)

11 -> 1011 (3 個計算置位, 3 是質數)
12 -> 1100 (2 個計算置位, 2 是質數)
13 -> 1101 (3 個計算置位, 3 是質數)
14 -> 1110 (3 個計算置位, 3 是質數)
15 -> 1111 (4 個計算置位, 4 不是質數)
注意:

L, R 是 L <= R 且在 [1, 10^6] 中的整數。
R - L 的最大值為 10000。

來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/prime-number-of-set-bits-in-binary-representation

著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。

簡單的小題,首先算出二進位制下1的個數,然後通過isSushu來判斷是不是素數,如果是素數就sum++,如果不是,就繼續迴圈。

class Solution {
    public boolean isSushu(int x) {
        if(x <= 1) return false;
        if(x == 2) return true;
        for(int i = 2; i <= Math.sqrt(x); i++) {
            if(x % i == 0){
return false; } } return true; } public int countPrimeSetBits(int left, int right) { int sum = 0; for(int i = left; i <= right; i++) { int x = i; int count = 0; while(x != 0) { if(x % 2 == 1) { count++; } x /= 2; } if(isSushu(count)) sum++; } return sum; } }

後來知道了一個方法,通過Integer下的bitCount可以直接獲取到二進位制下1的個數,時間直接減少n倍
在這裡插入圖片描述

class Solution {
    public boolean isSushu(int x) {
        if(x <= 1) return false;
        if(x == 2) return true;
        for(int i = 2; i <= Math.sqrt(x); i++) {
            if(x % i == 0){
                return false;
            }
        }
        return true;
    }
    public int countPrimeSetBits(int left, int right) {
        int sum = 0;
        for(int i = left; i <= right; i++) {
            int count = Integer.bitCount(i);
            if(isSushu(count)) sum++;
        }
        return sum;
    }
}

繼續改善,由於題目中給的最大數是 10 的 6 次方,而 2 的 20 次方是大於 10 的 6 次方的,所以給定的數中,最多就只能有19 個1,那個數就是二進位制下的 1111111111111111111 所以我們只要判斷,1的個數是不是19以內的質數即可,這樣又降了一些複雜度。2的十次方是1024大家都知道,那麼2的20次方就是1024的平方,也就是比十的六次方要大一些,這樣我們就可以算出 2的19次方是小於10 的6 次方的

class Solution {
    public boolean isSushu(int x) {
        return (x == 2 || x == 3 || x == 5 || x == 7 || x == 11 || x == 13 || x == 17 || x == 19);
    }
    public int countPrimeSetBits(int left, int right) {
        int sum = 0;
        for(int i = left; i <= right; i++) {
            int count = Integer.bitCount(i);
            if(isSushu(count)) sum++;
        }
        return sum;
    }
}