Algorithm 寻找对整数数组进行异或运算以产生零的总方法

Algorithm 寻找对整数数组进行异或运算以产生零的总方法,algorithm,math,Algorithm,Math,如果我们有一个整数数组,那么我们如何才能找到对它们进行异或运算的方法数,从而使结果为0。这里,在每一步中,只有一个整数(i)可以减少任意数量,比如d,使得(i-d)>=0。例如,对于整数11,15,8,我们可以将11减少到7,使7^15^8=0。类似地,15可以减少到3,这样11^3^8=0,8可以减少到4,这样11^15^4=0。因此,总的方法是3 我的方法:对于每个整数,继续减少它,并在每一步将其与数组中的剩余整数进行异或,如果结果为0,则中断。检查所有整数并获得总方式。但这是0(n^2)。

如果我们有一个整数数组,那么我们如何才能找到对它们进行异或运算的方法数,从而使结果为0。这里,在每一步中,只有一个整数(i)可以减少任意数量,比如d,使得(i-d)>=0。例如,对于整数
11,15,8
,我们可以
将11减少到7
,使7^15^8=0。类似地,
15可以减少到3,这样11^3^8=0,
8可以减少到4,这样11^15^4=0。因此,总的方法是3

我的方法:对于每个整数,继续减少它,并在每一步将其与数组中的剩余整数进行异或,如果结果为0,则中断。检查所有整数并获得总方式。但这是0(n^2)。有什么有效的方法吗?
谢谢。

您可以对数组中的所有整数进行异或运算,然后在循环中对每个整数的结果进行异或运算(它将从所有整数中“删除”该整数,因为
x^x
始终为0)。因此,您将获得其他成员的XOR,这就是要替换的数字(因为
x^x
始终为0)

int[]a=新的int[size];
//初始化“a”数组
int[]b=新的int[size];
int all=0;

对于(inti=0;i,这与在长度和为x的数组中查找k个数非常相似

对于k=1:显而易见。查找等于0的元素

对于k=2:对数字进行排序,对于每个数字,检查数组中是否存在0^a

对于k=3:对数字进行排序,对于每对数字a和b,检查数组中是否存在^b^0

对于k=4:计算数组中每两个数字的XOR并排序。对于每对数字a和b,检查排序列表中是否存在a^b^0

诸如此类

对于k=1,复杂性为O(n),k-2:nlogn,k=3:n^2logn,k=4:n^2logn,依此类推

    int[] a = new int [size];
    //initialize 'a' array
    int[] b = new int [size];
    int all = 0;
    for(int i = 0; i<a.length; i++)
        all=all^a[i];

    for(int i =0; i< size; i++)
        b[i] = all^a[i];