题目
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
解决方案
方法一
function singleNumber(arr) {
let result = 0;
for(let i = 0, len = arr.length; i < len; i++) {
result ^= arr[i];
}
return result;
}
方法二
// 推荐 直接使用 reduce
function singleNumber(arr) {
let num = arr.reduce((pre, cur, index) => {
return pre ^ cur;
}, 0);
return num;
}
示例
singleNumber([2,2,1]); // 1
singleNumber([2,3,7,3,2,5,5]); // 7
解题思路
- 只有一个元素出现了一次,其它都是两次,可使用异或运算 ^;
- 异或运算(无进位相加,相同为 0,不同为 1),具有如下 3 个特质:
- n ^ 0 = n;
- n ^ n = 0;
- 满足交换律和结合律;
- 也就是说,通过交换律,将两次出现的元素相加得到 0,最后与一次出现的元素相加就是其本身;
- 此题也可以衍生成偶数和奇数。如:偶数次出现,和奇数次出现。解题方法是一样的;
- 如果对异或运算还有疑惑和不解,可参考此篇《详解异或运算》;
- 方法二使用
JavaScript
数组函数reduce
,如有不解请进入此篇学习; - 此题目来自Leetcoode 力扣;