一、题目



二、解题思路
核心原理
设两组异或和为 A、B,则:
A⊕B=1⊕2⊕3⊕4
若 A=B,则 A⊕B=0,即总异或和必须为 0。
首先读取测试用例数,对每个用例读取数组长度和元素,将数组中所有数字依次进行异或运算 ,如果最终的总异或结果为 0 ,就说明可以将数组分成两组使两组异或和相等,输出 YES ,否则输出 NO。
三、代码
java
import java.util.Scanner;
// 1:无需package
// 2: 类名必须Main, 不可修改
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
//在此输入您的代码...
int test=scan.nextInt();
for(int h=1;h<=test;h++){
int length=scan.nextInt();
int tempArr[]=new int[length];
for(int i=0;i<length;i++){
tempArr[i]=scan.nextInt();
}
int sum=tempArr[0];
for(int j=1;j<length;j++){
sum=sum^tempArr[j];
}
if(sum==0){
System.out.println("YES");
}else{
System.out.println("NO");
}
}
scan.close();
}
}
四、问题与解决
(一)在计算机中异或符号^
五、知识点总结
1、异或运算(^)
计算机中用 ^ 表示,核心规则是相同为 0,不同为 1 ,且满足 x⊕x=0、x⊕0=x。
2、分组判定核心定理
若能将数组分成两组且两组异或和相等,则数组所有元素的总异或和一定为 0;反之,总异或和为 0 时,一定可以完成分组。
3、解题固定流程
遍历数组计算总异或和 ,结果为 0 输出YES,否则输出NO。
4、计算机逻辑 / 位运算 极简抄表
| 运算名称 | 符号(代码) | 运算规则 | 核心公式 / 等价写法 | |
|---|---|---|---|---|
| 逻辑非 | ! |
真变假,假变真 | !true=false、!false=true |
|
| 按位非 | ~ |
二进制 0 变 1,1 变 0 | 仅作用于整数位运算 | |
| 按位与 | & |
全 1 为 1,有 0 为 0 | 二进制位逐位运算 | |
| 按位或 | ` | ` | 有 1 为 1,全 0 为 0 | 二进制位逐位运算 |
| 按位异或 | ^ |
不同为 1,相同为 0 | 异或运算核心符号 | |
| 按位同或(XNOR) | 无专用符号 | 相同为 1,不同为 0 | !(a ^ b) |
|
| 按位与非(NAND) | 无专用符号 | 先与后非 | !(a & b) |
|
| 按位或非(NOR) | 无专用符号 | 先或后非 | `!(a | b)` |
超精简记忆口诀
非:!(逻辑)、~(位),01 互换最直接
与:& 全 1 才 1,或:| 有 1 就 1
异或:^ 不同才 1,同或是它的反
与非 / 或非 / 同或:都是「先运算,再取反」