1 找单独的数(位运算) Java

97 阅读1分钟

容易想到的使用HashMap或者桶记录次数的方式这里就不写了,题目要求节约空间,由于卡片要么出现一次要么两次,很容易联想到异或运算。

顺便复习一下异或运算

  1. 自反性:任何数与自身进行异或运算的结果为0,即 a⊕a=0。
  2. 交换律和结合律:异或运算满足交换律和结合律,即 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;
    }
}