算法思想
这道题的算法思想很巧妙,用到了位运算的某些知识,我们可以发现用到了位运算的题都很巧妙,很神奇
异或知识点
异或运算(^)
运算规则:0^0=0 0^1=1 1^0=1 1^1=0
简而言之:相同为0,不同为1
性质:
1:交换律
2:结合律: (a^b)^c == a^(b^c)
3:对于任何数x,都有 x^x=0,x^0=x
4、自反性: a^b^b=a^0=a;
1:先算出所有数异或的值,那么最后得出sum = x ^ y,相同的值都会被消掉
2:求出sum的某一位等于1,那么可以分为两大类,一个第k位等于1,一个第k位不等于1,因为相同为0,不同为1,x,y肯定会被分开
3:求两边数的异或运算,相同的数会被分到同一类,异或为0,最后剩下了x,y
java代码
class Solution {
public int[] findNumsAppearOnce(int[] nums) {
int sum = 0;
for(int x : nums) sum ^= x; //x ^ y
int k = 0, m = 0, n = 0;
while((sum >> k & 1) == 0) k ++;
for(int x : nums)
if((x >> k & 1) == 0) m ^= x;
else n ^= x;
int[] res = {n, m};
return res;
}
}