题目源自:力扣 #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)
总结
题目难度较为简单,但是利用异或去解决也算是奇思妙想,多点尝试一些新的方法可能可以更好地优化算法。