给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
说明:
你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
示例 1:
输入: [2,2,1]
输出: 1
示例 2:
输入: [4,1,2,1,2]
输出: 4
异或运算 ^:
0 ^ 1 结果是1, 0^0 和 1^1 结果都是0 ;
异或运算是相等为0,不相等为1
性质1:
10010111 ^ 10010111 结果是 00000000
即2个相等的数字异或的结果是0
性质2
异或具有交换律和结合律: (以下是10进制数字)
5^6^7^5^6 = 5^5^6^6^7
证明:
结合律:
1^0^1 = (1^0)^1=1^(0^1)
交换律:
1^0^1 = 0^1^1
1^0^1 = 1^1^0
对于n个10进制数,想象成一个n×8的矩阵,矩阵的每一行表示10进制数的2进制形式。 对于这n行,随便进行交换与结合,都不影响最后的结果
故代码:
class Solution:
def singleNumber(self, nums: List[int]) -> int:
a = 0
for num in nums:
a = a ^ num
return a