容易想到的使用HashMap或者桶记录次数的方式这里就不写了,题目要求节约空间,由于卡片要么出现一次要么两次,很容易联想到异或运算。
顺便复习一下异或运算:
- 自反性:任何数与自身进行异或运算的结果为0,即 a⊕a=0。
- 交换律和结合律:异或运算满足交换律和结合律,即 a⊕b=b⊕a且 a⊕(b⊕c)=(a⊕b)⊕c。 这题可以利用自反性,对数组每个元素做异或运算,出现两次运算结果都为0,可以抽象成0和出现一次的数字异或,最终的结果就是出现一次的数字。
public class Main {
public static int solution(int[] cards) {
// Edit your code here
int uniNum = 0;
for (int num : cards) {
uniNum ^= num;
}
return uniNum;
}
}