Java 给定一个+;ve整数,求在O(n)时间内出现奇数次的数&;恒定空间。
给定一个正整数数组。除一个数字出现奇数次外,所有数字都出现偶数次。在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() {
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]范围内。