异或运算,也称为「按位异或」,是计算机中常见的一种位运算操作。异或是一种二进制运算,用符号 ^ 表示,其计算规则是对二进制数进行逐位运算,当两个二进制数的当前位不同时,位运算结果为 1,否则为 0。
举个例子,设二进制数 a=101101,b=010110,则 a^b 的结果为:
101101
^ 010110
---------
111011
二进制的加法运算规则中,每一位只会对应进位或不进位两种情况,而异或运算的结果恰好把这两种情况都包含进去了。因此异或运算在计算机中被广泛使用,尤其是在编码和加密方面。
在编程中,异或运算还有一些其他的特性:
- 一个数再次与自身异或的结果是 0。
- 异或运算满足「交换律」和「结合律」,即 a^b^c = (a^b)^c = a^(b^c)。
- 异或运算可以用来交换两个变量的值,而且不需要借助第三个变量,只需进行两次异或运算即可。例如:a = a^b, b = a^b, a = a^b。
力扣经典题目:
给你一个 非空 整数数组 nums
,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
你必须设计并实现线性时间复杂度的算法来解决此问题,且该算法只使用常量额外空间。
实现代码:
class Solution:
def singleNumber(self, nums: List[int]) -> int:
aa = 0
for i in nums:
aa = aa ^ i
return aa
例题升级版,
给你一个整数数组 nums
,除某个元素仅出现 一次 外,其余每个元素都恰出现 三次 。请你找出并返回那个只出现了一次的元素。
你必须设计并实现线性时间复杂度的算法且使用常数级空间来解决此问题。
同样可以用异或方法解答:
class Solution:
@staticmethod
def singleNumber(nums):
a, b = 0, 0
for x in nums:
b = (b ^ x) & ~a
a = (a ^ x) & ~b
return b
异或看不懂,可以用其他办法解决:
class Solution:
def singleNumber(self, nums: List[int]) -> int:
num_count = {}
# 统计每个数字出现的次数
for num in nums:
num_count[num] = num_count.get(num, 0) + 1
# 找出只出现一次的数字
for num, count in num_count.items():
if count == 1:
return num
# 如果没有找到,则返回0(这里可以根据实际情况选择其他默认值)
return 0