算法:只出现一位的数字

191 阅读1分钟

题目源自:力扣 #136 只出现一次的数字

算法难度:简单

题目:

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

思路:

题目要求找出数组中仅出现了一次的元素,其余元素均出现了两次,说明数组的规模是形如2m+1的规模的,类似于aabbxccdd,看到这里,可以想到三个思路


(1)Set

利用Set我们可以通过判断得到最终结果,即

if(set.count(num[i]))    set.erase(num[i]);
else    set.insert(num[i]);

时间复杂度为:O(n)

空间复杂度为:O(n)


(2)数学方法

对于一个2m+1的数组,其中元素仅有一个不重复,如aabxbcc,可以得到公式:

x=(a+b+c+x)*2-(a+a+b+x+b+c+c)

该方法需要使用set筛选得到abcx这四个数,然后对数组内所有数进行相加,最终得到结果。

时间复杂度为:O(n)

空间复杂度为:O(n)


(3)异或

异或运算:

对于相同的两个数,a^a=0

0与任意数进行异或运算,结果为该值,即:0^a=a

异或符合结合律和交换律,即:a^b^a=a^a^b=0^b=b

由以上,我们可以对整个数组进行异或运算,从而得到结果

for(auto i:nums){
    result ^=i;
}
return result;

时间复杂度:O(n)

空间复杂度:O(1)


总结

题目难度较为简单,但是利用异或去解决也算是奇思妙想,多点尝试一些新的方法可能可以更好地优化算法。