如果你想在校招中顺利拿到更好的offer,阿秀建议你多看看前人的经验 ,比如准备 、简历 、实习 、上岸经历 、校招总结 、阿里、字节、腾讯、美团等一二线大厂真实面经 、也欢迎来一起参加秋招打卡活动 等;如果你是计算机小白,学习/转行/校招路上感到迷茫或者需要帮助,可以点此联系阿秀;免费分享阿秀个人学习计算机以来的收集到的好资源,点此白嫖;如果你需要《阿秀的学习笔记》网站中求职相关知识点的PDF版本的话,可以点此下载
# 204. 计数质数
力扣原题链接(点我直达) (opens new window)
统计所有小于非负整数 n 的质数的数量。
示例:
输入: 10
输出: 4
解释: 小于 10 的质数一共有 4 个, 它们是 2, 3, 5, 7 。
1
2
3
2
3
# 第一版,暴力法,超时
int isPrimes(int i) {
for (int j = 2; j * j <= i; ++j) {
if (i % j == 0) return 0;
}
return 1;
}
int countPrimes(int n) {
if (n <= 2) return 0;
int sum = 0;
for (int i = 2; i < n; ++i) {
sum += isPrimes(i);
}
return sum;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 第二版,比较牛逼的一种解法
执行用时 :40 ms, 在所有 cpp 提交中击败了91.18%的用户
内存消耗 :21.6 MB, 在所有 cpp 提交中击败了5.23%的用户
这题搜到一个非常牛逼的算法,叫做厄拉多塞筛法. 比如说求20以内质数的个数,首先0,1不是质数.2是第一个质数,然后把20以内所有2的倍数划去.2后面紧跟的数即为下一个质数3,然后把3所有的倍数划去.3后面紧跟的数即为下一个质数5,再把5所有的倍数划去.以此类推.
int countPrimes(int n) {
vector<int> a(n);
int count = 0;
for (int i = 2; i < n; i++)
a[i] = 1;
for (int i = 2; i < n; i++)
if (a[i])
{
count++;
for (int j = 2 * i; j < n; j += i)
a[j] = 0;
}
return count;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
← 202.快乐数 205. 同构字符串 →