给定+ ve整数数组,找出在O(n)时间和时间内出现奇数次数的数字。恒定的空间。

时间:2014-02-08 21:52:03

标签: 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 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)。这不好。

我应该使用哪种方法?

1 个答案:

答案 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 <= ns <= (n-1)/2。所以空间复杂度 在第二种方法中是O((n-1)/2)。你的阵列时你实现了它 看起来像这样:s数字出现两次,1数字出现一次。