136.只出现一次的数字
给你一个 非空 整数数组
nums
,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
你必须设计并实现线性时间复杂度的算法来解决此问题,且该算法只使用常量额外空间。示例1:
输入:nums = [2,2,1]
输出:1示例2:
输入:nums = [4,1,2,1,2]
输出:4示例3:
输入:nums = [1]
输出:1提示:
- 1 < = n u m s . l e n g t h < = 3 ∗ 1 0 4 1 <= nums.length <= 3 * 10^4 1<=nums.length<=3∗104
- − 3 ∗ 1 0 4 < = n u m s [ i ] < = 3 ∗ 1 0 4 -3 * 10^4 <= nums[i] <= 3 * 10^4 −3∗104<=nums[i]<=3∗104
- 除了某个元素只出现一次以外,其余每个元素均出现两次。
该问题的主要难点在于需要同时满足时间复杂度为O(n)和空间复杂度为O(1)。
遍历数组,用另一个数组对出现的数字进行记录,可以实现时间复杂度为O(n),但其空间复杂度达到了O(n);只使用一个临时变量,对每一个元素,向后查找是否存在,可以实现空间复杂度为O(1),但时间复杂度达到了
O
(
n
2
)
O(n^2)
O(n2)。
位运算
问题的关键突破点在于两次。除了需要找出的x外,每个元素出现了两次,而不是多次,只要将相同两个元素的影响消除,就能得到最终的正确结果。
对两个相同的数使用按位异或运算,得到的结果为0。对整个数组运算后,最终结果就是只出现一次的数。
class Solution:
def singleNumber(self, nums: List[int]) -> int:
ans = 0
for n in nums:
ans = ans ^ n
return ans