给你一个 非空 整数数组 nums
,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
你必须设计并实现线性时间复杂度的算法来解决此问题,且该算法只使用常量额外空间。
示例 1 :
输入:nums = [2,2,1] 输出:1
示例 2 :
输入:nums = [4,1,2,1,2] 输出:4
示例 3 :
输入:nums = [1] 输出:1
提示:
1 <= nums.length <= 3 * 104
-3 * 104 <= nums[i] <= 3 * 104
- 除了某个元素只出现一次以外,其余每个元素均出现两次。
解法:
本人解法(与官方一样):
使用异或^进行求解:
class Solution {
public int singleNumber(int[] nums) {
int a = 0;
for (int num : nums) {
a ^= num;
}
return a;
}
}
以[4,1,2,1,2]为例,4 ^ 1 = 5赋值给a,则a = 5,然后a ^ 2 = 5 ^ 2 = 7,则a = 7,继续a ^ 1 = 7 ^ 1 = 6,则 a = 6,继续a ^ 2 = 6 ^ 2 = 4,最后a = 4。
因为在二进制中1 ^ 1 = 0,0 ^ 0 = 0,0 ^ 1 = 1,既a ^ b ^ a = (a ^ a) ^ b = b
所以例子中4 ^ 1 ^ 2 ^ 1 ^ 2 = 1 ^ 1 ^ 2 ^ 2 ^ 4 = 4就能得出只出现的那一个数字。