异或找到两个列表之间缺少的元素

时间:2017-08-18 01:31:45

标签: python bitwise-xor

我尝试解决这个问题

"考虑一组非负整数。通过改组第一阵列的元素并删除随机元素来形成第二阵列。给定这两个数组,找到第二个数组中缺少的元素。"

其中一个解决方案是使用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的基本原理。但我无法理解上述代码如何找到结果。

2 个答案:

答案 0 :(得分:3)

一些重要的概念:

  1. 数字的XOR始终为0

  2. 0的数字的XOR始终是数字本身

  3. XOR操作的顺序无关紧要

  4. 有了这个,请考虑:

    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会翻转您当前拥有的所有非零位。

所以当你遇到两次相同的数字时,你已经翻过相同的位数两次 - 这意味着你又回到了你开始的状态。

两个列表中出现的每个数字都会“取消自身”。唯一未被取消的号码是第二个列表中缺少的号码。

每个整数是什么并不重要 - 如果数字出现两次,则位将翻转两次,如果数字出现一次,则翻转一次。如果第一个或第二个数组中缺少该数字,则无关紧要。