题目描述:
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
要求:
1、算法具有线性时间复杂度O(n)
2、不使用额外空间
示例 :
输入: [4,1,2,1,2]
输出: 4
方法一:异或(推荐)
解题思路:
对数组遍历一次,对每个数字相异或,由于异或支持交换律和结合律,相同的数字异或得0,0和任何数异或得任何数,所以最后只会剩下唯一的那个数字。
时间复杂度:O(n) 空间复杂度O(1)
代码:
function searchOnly(arr) {
let flag = 0;
for (let item of arr) {
flag ^= item;
}
return flag;
}
/*测试*/
let arr = [2, 5, 3, 5, 7, 3, 2];
console.log(searchOnly(arr));
补充知识:
异或:
- a ⊕ 0 = a
- a ⊕ a = 0
而且异或支持交换律和结合律。