给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。

原题

示例 1:


输入: [2,2,1] 输出: 1



示例 2:


输入: [4,1,2,1,2] 输出: 4



思路:由于不知道数组元素的大小,所以之前想的开个超级大的数组标记然后遍历无法实现。。。。。

那不行,怎么办。。。。。

可以这么想:(1)我可以遍历数组,开个set,然后把遍历的元素在set中搜索,如果有则从set中去掉,否则添加到set中去,这样子最后不就剩下出现一次的那个元素了嘛!!!BUT还是不太优化;

(2)那就来个线性时间的吧:位运算:对于异或(学过计算机组成原理都知道的,0^0=0,1^1=0,0^1=1)而言,如果两个数相同,异或之后肯定是个零,所以我们就从一开始就遍历数组,不断异或,出现两次的数肯定都没了,而剩下的肯定是那个出现一次的元素。

ok,来算法

int singleNumber(int* nums, int numsSize){
    int a=0;
    for(int i=0;i<numsSize;++i)
        a^=nums[i];
    return a;
}