我看到了一个问题,即从集合中找到只包含一个distict号码的非重复数字,其余的numberes可以重复任意偶数次。有一个约束,你需要使用常量内存在一次传递中找到该数字。 {假设所有都是正数} 通过实现这个功能,我很容易实现这一点
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;
但这不起作用
Problem2
如果我采用像{2,5,7,5,7,1,2,7,5,2}这样的集合中的元素,那么XNORing会使数字的每三次出现为0,并且XNORing为1(单次出现)为0如果我翻转(〜)我从XNOR操作得到的东西,那么最后的结果就可以实现。但这也不起作用。
我知道为什么这个语义出错了,因为它是按位运算不合逻辑。但是如果xoring可以用于查找数字的奇数出现是不是有任何方法用XNOR来查找偶数的数字?
<登记/>
我不确定这个问题的可行性我只是出于好奇而请求,如果它在任何情况下无关紧要,请原谅我的无知。
答案 0 :(得分:3)
XOR
和XNOR
是可交换的。这意味着序列的任何重新排序将始终产生相同的结果。
您已经知道a ^ a
为零。这就是单号抽象的工作原理:a ^ b ^ a
等于a ^ a ^ b
等于0 ^ b
b
。
但a XNOR a
也是 <{1}}的函数。它只是1位的整个负载。因此,您无法使用a
恢复a
的值,因此您的方法无效。