跳转至

1835. 所有数对按位与结果的异或和

难度:困难

题目

列表的 异或和(XOR sum)指对所有元素进行按位 XOR 运算的结果。如果列表中仅有一个元素,那么其 异或和 就等于该元素。

  • 例如,[1,2,3,4]异或和 等于 1 XOR 2 XOR 3 XOR 4 = 4 ,而 [3]异或和 等于 3

给你两个下标 从 0 开始 计数的数组 arr1arr2 ,两数组均由非负整数组成。

根据每个 (i, j) 数对,构造一个由 arr1[i] AND arr2[j](按位 AND 运算)结果组成的列表。其中 0 <= i < arr1.length0 <= j < arr2.length

返回上述列表的 异或和

示例 1:

输入:arr1 = [1,2,3], arr2 = [6,5]
输出:0
解释:列表 = [1 AND 6, 1 AND 5, 2 AND 6, 2 AND 5, 3 AND 6, 3 AND 5] = [0,1,2,0,2,1] ,
异或和 = 0 XOR 1 XOR 2 XOR 0 XOR 2 XOR 1 = 0 。

示例 2:

输入:arr1 = [12], arr2 = [4]
输出:4
解释:列表 = [12 AND 4] = [4] ,异或和 = 4 。

提示:

  • 1 <= arr1.length, arr2.length <= 105
  • 0 <= arr1[i], arr2[j] <= 109

Reference

题解

设两个数列\(A=\{a_i\}_m\)\(B=\{b_j\}_n\),并使用运算符\(\otimes\)表示 异或 操作,使用运算符\(\land\)表示 操作,则本题的结果为:

\[ f(A, B) = \bigotimes_{i=1}^{m} \bigotimes_{j=1}^n a_i\land b_j \]

考虑表达式\((a\otimes b) \land (a \otimes c)\)

\[ \begin{aligned} & (a\otimes b) \land (a \otimes c) \\ \Leftrightarrow & ((a\lor b)\land (\lnot a\lor\lnot b)) \land ((a\lor c)\land (\lnot a\lor\lnot c)) \\ \Leftrightarrow & (a\lor b)\land (\lnot a\lor\lnot b) \land (a\lor c)\land (\lnot a\lor\lnot c) \\ \Leftrightarrow & (a\land (b\lor c)) \land (a\land (\lnot b\lor\lnot c)) \\ \Leftrightarrow & a\land (b\otimes c) \end{aligned} \]

因此,\(\otimes\)运算对\(\land\)运算满足分配律,有:

\[ \begin{aligned} f(A, B) &= \bigotimes_{i=1}^{m} \bigotimes_{j=1}^n a_i\land b_j \\ &= \bigotimes_{i=1}^{m} \left(a_{i}\land\bigotimes_{j=1}^n b_j\right) \\ &= \left(\bigotimes_{i=1}^{m} a_i\right)\land\left(\bigotimes_{j=1}^n b_j\right) \end{aligned} \]
int getXORSum(int* arr1, int arr1Size, int* arr2, int arr2Size){
    int a = 0, b = 0, i = 0;
    for (i = 0; i < arr1Size; i++)
        a ^= arr1[i];
    for (i = 0; i < arr2Size; i++)
        b ^= arr2[i];
    return a & b;
}

评论