题目
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
说明:你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
实现
思路1 Hashmap
第一想法就是建立哈希表来记录每个数字的出现次数。但不符合题目不使用额外空间的要求。
思路2 位运算
这里要用到异或(XOR)的三条性质:
- 0和二进制位做XOR运算,得到的仍然是这个二进制位;
- 相同的两个二进制位做XOR运算,结果为0;
- XOR满足交换律和结合律
因此我们可以对数组里所有数字进行异或运算,由于交换律和结合律的性质,可以理解成我们可以先计算所有相同数字异或的结果,也就是0。最后式子就变为 0 XOR 只出现一次的数,那么结果就是只出现一次的这个数字本身。
class Solution:def singleNumber(self, nums: List[int]) -> int:for i in range(1, len(nums)):nums[0] ^= nums[i]return nums[0]
时间复杂度:. 只需要对数组遍历一次。
空间复杂度:
