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 是質數)
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;
}
}