给出一组正整数。除了一个出现奇数次数的数字之外,所有数字都出现偶数次。在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));
}
方法1:通过对数组中的所有元素进行X-OR运算
我正在尝试x或所有元素。是那个 正确的做法?以上是使用X-OR的代码
方法2:使用HashMap 如果我使用hashmap,空间复杂度将为O(n)。这不好。
我应该使用哪种方法?
答案 0 :(得分:0)
这个问题假设只有一个数字出现奇数
数组中的时间。如果你有更多这样的数字 - 比如他们的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 <= n
即s <= (n-1)/2
。所以空间复杂度
在第二种方法中是O((n-1)/2)
。你的阵列时你实现了它
看起来像这样:s
数字出现两次,1
数字出现一次。