57
57
58
58
<!-- 这里可写通用的实现逻辑 -->
59
59
60
- 题目中 ` left ` 和 ` right ` 的范围均在 10< sup >6</ sup > 内,而 2< sup >20</ sup >=1048576,因此二进制中 1 的个数最多也就 20 个,20 以内的质数为 {2, 3, 5, 7, 11, 13, 17, 19}。
60
+ ** 方法一:数学 + 位运算 **
61
61
62
- 我们可以遍历 ` [ left, right] ` 范围内的每个数,计算出每个数的二进制表示中 1 的个数,判断此个数是否在上述列举的质数中,是则累加结果 。
62
+ 题目中 $ left$ 和 $ right$ 的范围均在 $10^6$ 以内,而 $2^{20} = 1048576$,因此,二进制中 $1$ 的个数最多也就 $20$ 个,而 $20$ 以内的质数有 ` [2, 3, 5, 7, 11, 13, 17, 19] ` 。
63
63
64
- 时间复杂度 ` O((right-left)*log right) ` ,其中求二进制中 1 的个数的时间为 ` O(log right) ` 。
64
+ 我们枚举 $[ left,.. right] $ 范围内的每个数,统计其二进制中 $1$ 的个数,然后判断该个数是否为质数,如果是,答案加一。
65
+
66
+ 时间复杂度 $O(n\times \log m)$。其中 $n = right - left + 1$,而 $m$ 为 $[ left,.. right] $ 范围内的最大数。
65
67
66
68
<!-- tabs:start -->
67
69
@@ -82,7 +84,7 @@ class Solution:
82
84
83
85
``` java
84
86
class Solution {
85
- private static Set<Integer > primes = new HashSet<> ( Arrays . asList (2 , 3 , 5 , 7 , 11 , 13 , 17 , 19 ) );
87
+ private static Set<Integer > primes = Set . of (2 , 3 , 5 , 7 , 11 , 13 , 17 , 19 );
86
88
87
89
public int countPrimeSetBits (int left , int right ) {
88
90
int ans = 0 ;
@@ -101,13 +103,10 @@ class Solution {
101
103
``` cpp
102
104
class Solution {
103
105
public:
104
- unordered_set<int > primes {2, 3, 5, 7, 11, 13, 17, 19};
105
-
106
106
int countPrimeSetBits(int left, int right) {
107
+ unordered_set<int > primes {2, 3, 5, 7, 11, 13, 17, 19};
107
108
int ans = 0;
108
- for (int i = left; i <= right; ++i)
109
- if (primes.count(__builtin_popcount(i)))
110
- ++ans;
109
+ for (int i = left; i <= right; ++i) ans += primes.count(__ builtin_popcount(i));
111
110
return ans;
112
111
}
113
112
};
@@ -116,15 +115,15 @@ public:
116
115
### **Go**
117
116
118
117
```go
119
- func countPrimeSetBits (left int , right int ) int {
120
- primes := map [int ]bool {2 : true , 3 : true , 5 : true , 7 : true , 11 : true , 13 : true , 17 : true , 19 : true }
121
- ans := 0
118
+ func countPrimeSetBits(left int, right int) (ans int) {
119
+ primes := map[int]int{}
120
+ for _, v := range []int{2, 3, 5, 7, 11, 13, 17, 19} {
121
+ primes[v] = 1
122
+ }
122
123
for i := left; i <= right; i++ {
123
- if primes[bits.OnesCount (uint (i))] {
124
- ans++
125
- }
124
+ ans += primes[bits.OnesCount(uint(i))]
126
125
}
127
- return ans
126
+ return
128
127
}
129
128
```
130
129
0 commit comments