我看到了一个问题,从只包含一个distict数的集合中寻找不可重复的数,而rest数可以重复任意偶数次。在那里有一个限制,你需要在一次使用恒定内存的过程中找到这个数字。{假设所有都是正数}。
我用这个函数很容易实现

  private static int nonRepeatingElement(int[] set)
  {
        int element = 0;
        for (int i = 0; i < set.length; i++)
        {
            element = (element ^ set[i]);
            System.out.println(element);
        }
    return element;
 }

这很好用。
现在只是出于好奇,我想用类似的约束条件来改变这个问题。
问题1
我想到了一个集合,它现在包含的元素可以出现任意奇数的时间,除了一个元素可以出现偶数的时间。for example{2,5,7,5,7,1,2,7,1,5,2}
现在考虑到xnor为1的每一个奇数出现给出0的逻辑,我把代码改得有点像
 for (int i = 0; i < set.length; i++)
            {
                element = (element ^ set[i]);
                System.out.println(element);
            }
        return ~element;

但这没用。
问题2
如果我在集合中取{2,5,7,5,7,1,2,7,5,2}这样的元素,认为XNORing将使数字的每三次出现为0,而XNORing的每三次出现(单次出现)为0将翻转1的位。因此,如果我翻转(~)从XNOR操作中获取的位,则可以得到最终结果。但这也不起作用。
我知道为什么这个语义会出错,因为它是按位操作而不是逻辑的,但是如果xoring可以用来发现一个数的奇数出现,那么xnor不可能找到一个数的偶数出现吗?
我不确定这个问题的可行性,我只是出于好奇,所以请原谅我的无知,如果它在任何情况下都是无关紧要的。

最佳答案

XORXNOR是可交换的。这意味着序列的任何重新排序都将产生相同的结果。
你已经知道a ^ a是零了。这就是单数抽象的工作原理:a ^ b ^ a等于a ^ a ^ b等于0 ^ bb
但是a XNOR a也不是a的函数。它只是一个1位的整体负载因此,使用a无法恢复a XNOR a的值,因此您的方法将不起作用。

10-06 03:32