给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
说明:
你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
示例 1:
输入: [2,2,1]
输出: 1
示例 2:
输入: [4,1,2,1,2]
输出: 4
我的解法
class Solution:
def singleNumber(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
for i,j in enumerate(nums):
#每次遍历都要查询n-1次,因此这种算法的时间复杂度是O(n^2),空间复杂度是O(1)
if j not in nums[:i] and j not in nums[i+1:]:
return j
结果超时了
一种可行的解法是利用异或运算.
首先介绍一下异或运算的定义:
如果两个数据的二进制对应的位相异时,结果中该位为1,否则为0.
例如2异或3,表示为2^3,即00000010^00000011=00000001,也就是1.
由定义可知,异或运算满足一下几个性质:
1.异或运算满足交换律,即对于任意的a,b,有a^b=b^a.也就是说异或运算与位置无关
2.对于任意的a,0与a异或的结果是a
3.对于任意的a,a^a的结果是0
再回到这题,因为异或运算与位置无关,因此数组中相同的数,无论他们的位置在哪里,都可以交换到一起,异或运算的结果是0,而0与任何一个数异或的结果是那个数本身.
具体到示例2就是4^1^2^1^2=1^1^2^2^4=0^4=4
因此,代码如下
class Solution():
def singleNumber(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
num = 0
for i in nums:
num ^= i
return num
虽然我没做出来,但是我发现并证明了异或运算的交换律啊(强行安慰自己)