两数之和为质数与电池分组:核心知识点与解题思路
我帮你把这次问的所有题目 + 关键疑问,全部整理成:
问题 + 代码思路 + 核心知识点,清晰分开,方便你复习。
一、第一题:两数之和是质数(你一开始超时那道)
你问过的内容
代码超时怎么办
质数筛那段看不懂
Set.add()和contains()关系continue作用输入顺序影响不影响结果
题目大意
给两个数组 a、b,问 a[i]+b[j] 满足:
和 ≤ n+m
和是质数
有多少个不同的和。
解题思路
先把所有 ≤ n+m 的质数提前筛出来(埃氏筛)。
用
HashSet存质数,contains()判断是 O(1),非常快。遍历所有 a[i]+b[j],符合条件就放进结果集合。
最后输出结果集合大小。
核心知识点
埃拉托斯特尼筛法:快速找 1~max 之间所有质数
HashSet 的作用
add:存数
contains:快速判断存在
自动去重
continue:跳过本轮循环剩下代码(你那题里可加可不加)
优化思路:先筛质数,再判断,不要每次都算质数
二、第二题:电池分成两组,异或和相等
你问过的内容
为什么总异或和为 0 就输出 YES
样例 1 计算过程
输入顺序影响吗
交换律、结合律例子
不用分组怎么判断
题目大意
把数组分成两个非空组,两组异或和相等,问能不能分。
解题思路
超级短:只算总异或和,等于0输出YES,否则NO
核心推导(你说最重要的)
设两组异或和:X、Y
总异或和 total = X ^ Y
题目要求 X = Y
则 total = X ^ X = 0
反过来:total=0 ⇨ 一定能分
核心知识点
异或性质
x ^ x = 0
x ^ 0 = x
交换律、结合律
→ 顺序不影响结果
a ^ b = b ^ a
(a^b)^c = a^(b^c)
存在性问题
不用求怎么分,只用判断能不能分
三、你所有疑问的统一总结
1. 代码超时怎么解决?
少用循环嵌套
质数用筛法预处理,不要每次判断
HashSet比循环查找快
2. 筛法代码理解
for (int i=2;i*i<=sum;i++) for (j=i; i*j<=sum; j++) set.remove(i*j);
先把所有数放进去
删掉所有质数的倍数
剩下就是质数
3. Set 用法
add(x):把 x 放进集合contains(x):看 x 在不在用来去重、快速判断
4. continue
跳过本轮循环后面代码
你那题里可加可不加
5. 异或题核心(最关键)
两组异或和相等 ⇔ 总异或和 = 0
不用管怎么分,只看总异或和
异或满足交换律、结合律,顺序不影响结果
如果你愿意,我可以把这两道题做成超简短背诵版笔记,考前看 2 分钟就能秒写代码。