【发布时间】:2015-01-25 21:17:42
【问题描述】:
我看到一个问题,用于从仅包含一个不同数字的集合中查找非重复数字,其余数字可以重复任意偶数次。存在一个限制,即您需要使用常量内存在单遍中找到该数字。 {假设都是正数}。
我通过制作此功能轻松实现了这一点
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 与 1(单次出现)为 0将翻转 1 的位。因此,如果我翻转(~)我从 XNOR 操作中得到的位,则可以实现最终结果。但这也不起作用。
我知道为什么这种语义会出错,因为它是按位运算不合逻辑的。但是如果 xoring 可用于查找数字的奇数出现,XNOR 没有任何方法可以找到数字的偶数吗?
我不确定这个问题的可行性,我只是出于好奇而问,如果在任何情况下都无关紧要,请原谅我的无知。
【问题讨论】:
-
XNOR 应该是
~(element ^ set[i]);但现在~在循环之后。 -
这里实际上有多个操作数(i/p),我必须对其应用 XNOR 操作。我无法级联 2 i/p xnor 操作的 o/p 以查找 3 i/p XNOR 操作。这就是为什么我首先对所有 i/p 进行异或运算,然后使用 ~,将最终异或值传递给调用函数。
-
我认为你不能用恒定的内存来存储任何大小的数字。对于偶数重复,您是在“做某事”然后“撤消它”,但是对于奇数重复,这没有任何意义。您需要保留有关您之前找到的数字的更多信息。