我尝试解决这个问题
"考虑一组非负整数。通过改组第一阵列的元素并删除随机元素来形成第二阵列。给定这两个数组,找到第二个数组中缺少的元素。"
其中一个解决方案是使用XOR
的代码def find(arr1, arr2):
result=0
# Perform an XOR between the numbers in the arrays
for num in arr1+arr2:
result^=num
print result
return result
arr1 = [1,2,3,4,5,6,7]
arr2 = [3,7,2,1,4,6]
该功能的结果是5。
我知道XOR的基本原理。但我无法理解上述代码如何找到结果。
答案 0 :(得分:3)
一些重要的概念:
数字的XOR始终为0
0的数字的XOR始终是数字本身
XOR操作的顺序无关紧要
有了这个,请考虑:
1 ^ 2 ^ 3 ^ 4 ^ 5 ^ 6 ^ 7 ^ 3 ^ 7 ^ 2 ^ 1 ^ 4 ^ 6 → (1 ^ 1) ^ (2 ^ 2) ^ (3 ^ 3) ^ (4 ^ 4) ^ (5) ^ (6 ^ 6) ^ (7 ^ 7) → 0 ^ 0 ^ 0 ^ 0 ^ 5 ^ 0 ^ 0 → 5
所以,奇怪的一个仍然存在。
答案 1 :(得分:0)
您从结果= 0
开始然后你保持对每个数组的所有元素进行XOR运算。 XOR会翻转您当前拥有的所有非零位。
所以当你遇到两次相同的数字时,你已经翻过相同的位数两次 - 这意味着你又回到了你开始的状态。
两个列表中出现的每个数字都会“取消自身”。唯一未被取消的号码是第二个列表中缺少的号码。
每个整数是什么并不重要 - 如果数字出现两次,则位将翻转两次,如果数字出现一次,则翻转一次。如果第一个或第二个数组中缺少该数字,则无关紧要。