问题
给你一个 非空 整数数组 nums ,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
你必须设计并实现线性时间复杂度的算法来解决此问题,且该算法只使用常量额外空间。
思路
由于数组中除了一个元素之外,其他所有元素都成对出现,我们可以遍历数组,
将所有元素进行异或运算。成对的元素在异或运算中会相互抵消,最终剩下的就是那个只出现一次的元素。
解法
class Solution:
def singleNumber(self, nums: list[int]) -> int:
result = 0
for num in nums:
result ^= num
return result
if __name__ == '__main__':
nums =[1,2,2,3,3,9]
solution = Solution()
result = solution.singleNumber(nums)
print(result)
学习
1、使用位运算的方法,特别是异或(XOR)运算。异或运算的特性是:
1)任何数与自己异或的结果为0:a ^ a = 0
2)任何数与0异或的结果是自己:a ^ 0 = a
3)异或运算是可交换的:a ^ b = b ^ a
4)异或运算是可结合的:(a ^ b) ^ c = a ^ (b ^ c)
2、异或操作有两个重要的性质:
任何数和它本身做 异或 操作结果都是 0。
任何数和 0 做 异或 操作结果都是它本身。
由于数组中除了一个元素之外,其他所有元素都成对出现,我们可以遍历数组,将所有元素进行异或运算。成对的元素在异或运算中会相互抵消,最终剩下的就是那个只出现一次的元素。