题目:只出现一次的数字
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
示例:
输入: [2,2,1] 输出: 1
输入: [4,1,2,1,2] 输出: 4
题解:
【方法1:异或】
采用异或的特性,解决此题
异或运算特性:
1、一个数和0异或结果为其本身:a ⊕ 0 =a
2、一个数的自身和自身进行异或,结果为0:a⊕a=0
3、异或满足交换律和结合律:a⊕b⊕a = (a⊕a)⊕b = 0⊕b = b
因此由于此特性,将所有数据累计进行异或,最后结果则为只出现一次的数字
var singleNumber = function(nums) {
let ans = 0;
let len = nums.length;
//累计进行异或
for(let i=0;i<len;i++){
ans = ans ^nums[i]
}
return ans
};
【方法2:采用hash】
采用一个hash来存储只出现一次的数字,若只出现一次,则放入hash,若出现两次,则删除
step1:创建一个hash
step2:对数组进行遍历
step3:判断该数字在hash中是否存在,若存在则将该数字从hash中删除,如果不存在,则放入hash中
/**
* @param {number[]} nums
* @return {number}
*/
var singleNumber = function(nums) {
let len = nums.length;
let result = new Set()
for(let i=0;i<len;i++){
if(result.has(nums[i])){
result.delete(nums[i])
}else {
result.add(nums[i])
}
}
return [...result]
};