用 XOR 解决序列号缺失问题
Missing sequence number problem solved with XOR
我正在尝试了解 XOR 运算如何设法解决问题 PermMissingElem
我知道 XOR 的特性之一是:
A ⊕ B = C
C ⊕ A = B
C ⊕ B = A
>>> 3 ^ 4
7
>>> 7 ^ 3
4
这可以重复任意数量的操作,在本例中是 2 个数字,但也可以是 3、4、5...n
另一个属性是:
A ⊕ A = 0
A ⊕ 0 = A
>>> 3 ^ 3
0
>>> 3 ^ 0
3
但是看问题PermMissingElem
怎么可能保证最后一次操作就是丢失的数字呢?有没有关于这个算法的文献,有人讲过吗?
A = [1,2,3,4,5,7,8,9,10,11]
missing_element = len(A)+1
for idx,value in enumerate(A):
print(missing_element, value, (idx+1), ' = ', missing_element ^ value ^ (idx+1))
missing_element = missing_element ^ value ^ (idx+1)
出来
11 1 1 = 11
11 2 2 = 11
11 3 3 = 11
11 4 4 = 11
11 5 5 = 11
> 11 7 6 = 10
10 8 7 = 5
5 9 8 = 4
4 10 9 = 7
> 7 11 10 = 6
可以看出:
11 ⊕ 7 ⊕ 6 = 10
7 ⊕ 11 ⊕ 10 = 6
异或运算是可交换的,应用顺序无关紧要。
具有相同值的两个异或相互抵消。
因此,从 0 开始并应用任何异或序列,然后是包含额外元素的相同序列,只保留额外元素的效果。
例如0 ⊕2⊕3⊕1⊕5 ⊕1⊕2⊕3⊕4⊕5 与 0⊕1⊕1⊕2⊕2⊕3⊕3⊕4⊕5⊕5 或 0⊕4 具有相同的效果。
既然你知道,输入范围 [1..n+1]
中的每个数字都恰好有一个,除了缺少一个 k
以及 a ⊕ a = 0
、
这一事实
如果你有另一个数组[1..n+1]
,没有遗漏k
,
然后,在合并这些数组时,我们将得到一个大数组,每个数字重复两次,除了 k
。所以,如果我们对这个数组的所有元素进行异或运算,每个重复的元素都会自行取消,我们将留下 k
,这是您缺少的数字。
我正在尝试了解 XOR 运算如何设法解决问题 PermMissingElem
我知道 XOR 的特性之一是:
A ⊕ B = C
C ⊕ A = B
C ⊕ B = A
>>> 3 ^ 4
7
>>> 7 ^ 3
4
这可以重复任意数量的操作,在本例中是 2 个数字,但也可以是 3、4、5...n
另一个属性是:
A ⊕ A = 0
A ⊕ 0 = A
>>> 3 ^ 3
0
>>> 3 ^ 0
3
但是看问题PermMissingElem 怎么可能保证最后一次操作就是丢失的数字呢?有没有关于这个算法的文献,有人讲过吗?
A = [1,2,3,4,5,7,8,9,10,11]
missing_element = len(A)+1
for idx,value in enumerate(A):
print(missing_element, value, (idx+1), ' = ', missing_element ^ value ^ (idx+1))
missing_element = missing_element ^ value ^ (idx+1)
出来
11 1 1 = 11
11 2 2 = 11
11 3 3 = 11
11 4 4 = 11
11 5 5 = 11
> 11 7 6 = 10
10 8 7 = 5
5 9 8 = 4
4 10 9 = 7
> 7 11 10 = 6
可以看出:
11 ⊕ 7 ⊕ 6 = 10
7 ⊕ 11 ⊕ 10 = 6
异或运算是可交换的,应用顺序无关紧要。
具有相同值的两个异或相互抵消。
因此,从 0 开始并应用任何异或序列,然后是包含额外元素的相同序列,只保留额外元素的效果。
例如0 ⊕2⊕3⊕1⊕5 ⊕1⊕2⊕3⊕4⊕5 与 0⊕1⊕1⊕2⊕2⊕3⊕3⊕4⊕5⊕5 或 0⊕4 具有相同的效果。
既然你知道,输入范围 [1..n+1]
中的每个数字都恰好有一个,除了缺少一个 k
以及 a ⊕ a = 0
、
如果你有另一个数组[1..n+1]
,没有遗漏k
,
然后,在合并这些数组时,我们将得到一个大数组,每个数字重复两次,除了 k
。所以,如果我们对这个数组的所有元素进行异或运算,每个重复的元素都会自行取消,我们将留下 k
,这是您缺少的数字。