Java 给定一个+;ve整数,求在O(n)时间内出现奇数次的数&;恒定空间。

Java 给定一个+;ve整数,求在O(n)时间内出现奇数次的数&;恒定空间。,java,arrays,algorithm,bit-manipulation,Java,Arrays,Algorithm,Bit Manipulation,给定一个正整数数组。除一个数字出现奇数次外,所有数字都出现偶数次。在O(n)时间和常量空间中查找数字 int getOddOccurrence ( int ar[]){ int i; int res = 0; for (i = 0; i < ar.size; i++) res = res ^ ar[i]; return res; } /* Diver function to test above function */ PSVM() {

给定一个正整数数组。除一个数字出现奇数次外,所有数字都出现偶数次。在O(n)时间和常量空间中查找数字

int getOddOccurrence ( int ar[]){
    int i;
    int res = 0;
    for (i = 0; i < ar.size; i++)
        res = res ^ ar[i];
    return res;
}

/* Diver function to test above function */
PSVM() {
    int ar[] = {2, 3, 5, 4, 5, 2, 4, 3, 5, 2, 4, 4, 2};
    SOP(getOddOccurrence(ar));
}
int getOddOccurrence(int ar[]{
int i;
int res=0;
对于(i=0;i
方法1:通过对数组中的所有元素进行X或Y运算

我正在尝试x-或所有元素。那是那辆车吗 正确的方法?上面是使用X-OR的代码

方法2:使用HashMap 如果我使用hashmap,空间复杂度将是O(n)。这不好


我应该使用哪种方法?

此问题假设只有一个数字出现在奇数
数组中的时间。如果你有更多这样的数字,就说其中的K个:
a1,a2。。。aK

然后在循环结束时,在
res
中,您将获得该值

res==a1^a2^…^aK

根据该值,您无法推断/提取所有K个未知数字
a1、a2、。。。aK

Buf。。。你看,如果K=1(即,如果正好有一个数字出现
奇数次),最后您将进入
res
仅此数字

使用第一种方法,只要你明白它为什么有效

此外,在第二种方法中,空间不是
O(n)
,而是
O(s)

其中
s
是数组中不同值的计数。当你
只有1个数字出现奇数次,我们可以肯定地说

2*s+1您在这里没有给我们提供足够清晰的规范。例如,如果一个以上的数字出现奇数次,会发生什么情况?在固定时间内这样做的想法是疯狂的……在一般情况下,空间复杂度是O(log),因为你不需要在hashmap中存储重复。@JonSkeet:这个问题已经被更正为固定空间和O(N)时间。我不确定这是否更有意义,除非空格被推到O(MAX_INT)。是“查找数字”还是“查找数字”还是“查找第一个数字”或“从数组中查找任何数字”?请看这里:这是您尝试复制的地方吗?这些数字非常小。可能还有一个额外的要求,即它们在[0,7]或[0,15]范围内。