【问题标题】:How to find uncoupled integer in an array? [duplicate]如何在数组中找到未耦合的整数? [复制]
【发布时间】:2012-04-12 05:53:58
【问题描述】:

可能重复:
Find integer not occurring twice in an array
Accenture interview question - find the only unpaired element in the array

给定一个奇数大小的整数数组。数组中的所有整数都出现两次,除了一个整数。如何以最有效(内存和复杂性)的方式找到这个解耦整数?

【问题讨论】:

    标签: c++ c algorithm


    【解决方案1】:

    如果将它们全部异或,最终将得到唯一的(未耦合的)值。

    这是因为x XOR x 对于所有x 值都为零,而0 XOR xx

    例如,以下程序输出99

    #include <stdio.h>
    int main (void) {
        int num[] = { 1, 2, 3, 4, 5, 99, 1, 2, 3, 4, 5};
        unsigned int i;
        int accum;
    
        for (accum = 0, i = 0; i < sizeof(num)/sizeof(*num); i++)
            accum ^= num[i];
    
        printf ("%d\n", accum);
    
        return 0;
    }
    

    就效率而言,基本上是 O(1) 空间和 O(n) 时间复杂度,最小、平均和最坏情况。

    【讨论】:

    • @Guarav,那么你将得到零,正如预期的那样。尝试一下。更改上面代码中的 99 并让'er rip :-)
    • 是的,没错,只是运行它。谢谢:) ... +1
    【解决方案2】:

    正如 pax 所建议的那样,将所有元素异或在一起将为您提供唯一的价值。

    int getUncoupled(int *values, int len)
    {
        int uncoupled = 0;
        for(int i = 0; i < len; i++)
            uncoupled ^= values[i];
        return uncoupled;
    }
    

    但是这里有一个小警告:没有解耦值和解耦值为零的集合之间有什么区别? x^x^y^y = 0x^x^0^y^y 不也等于零吗?值得深思:)

    【讨论】:

    • 输出没有区别,但是考虑到规范“奇数大小”和“数组中的所有整数出现两次,除了一个整数”,x^x^y^y 是不可能的。
    • 我的错误,我的意思是如果数组不是奇数大小的。鉴于这是一个问题限制,我想我指出这一点是无关紧要的。
    猜你喜欢
    • 2020-05-26
    • 2020-11-26
    • 2014-02-20
    • 1970-01-01
    • 2012-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-24
    相关资源
    最近更新 更多