题目描述:
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
示例描述:
题目分析:
题目告诉我们找出只出现了一次的那个数字即可
解题分析:
题目中给了我们,很多数字都出现了两次,只有一个没有出现两次,所以我首先想到的是暴力的求解,虽然这个的时间空间等等复杂度都很高,但这确实是一个很好的方法来解决这个问题,我采取的方法是,找到两个相同的数字,因为如果你找不相同你会发现很难找,找到两个相同的数字之后,直接删除这两个,数组的长度就减2了,不断循环,直到数组只有一个元素为止
var singleNumber = function(nums) {
for(var i=0;i<nums.length;i++){
for(var j=i+1;j<nums.length;j++){
if(nums[i] ==nums[j]){
nums.splice(j,1)
nums.splice(i,1)
i=0,j=i
}
}
}
return nums
};
但是这样做,会有很大的时间和空间的开销,其实不是很建议这样做,毕竟这是算法题,所以有没有什么办法能够让他的复杂度降低呢?
答案是异或运算:
1. 归零律:
2. 恒等律:
3. 交换律:
4. 结合律:
只需要牢牢的记住这四个异或运算的规律就可以了,我们先随便找到一个数字,当第一次循环的时候,数字肯定是第一个数字,当第二个数字出现的时候,如果相等,他们的异或结果是零,如果不相等,将这两个数使用二进制异或之后得出结果,最终就能得到我们想要的结果
代码如下:
var singleNumber = function(nums) {
let num =0
for(var i=0;i<nums.length;i++){
num ^= nums[i]
}
return num
};
这样一来,就解决了相应的问题,得出了想要的结果