从阵列中获取数字的高效算法

时间:2010-12-25 09:22:30

标签: c++ objective-c algorithm

问题在于:

一个数组中有2 * N + 1个整数,并且有N对int数,i,e,两个1或两个3等,所以只有一个int数,没有对。

问题是如何使用高效算法找到这个数字。

感谢您提供任何线索或评论。

3 个答案:

答案 0 :(得分:6)

好的,好的,这是对我评论的解释。: - /

missingNum = 0
for each value in list
   missingNum = missingNum ^ value //^ = xor
next
print(missingNum)

这是一个线性算法,O(n)。

那么这里发生了什么?比如,对于那些熟悉XOR运算符的人,我们[2,1,3,1,2]知道1 ^ 1 = 00 ^ 0 = 01 ^ 0 = 10 ^ 1 = 1(记得没有进位)< / p>

基本上,当我们对一个位序列(100110111)进行异或,并且它具有偶数1时,如果1's的数量为奇数,则每个都将自身异或为零... XOR产生1

所以在我们的例子中,从lsb开始

2 : 0010
1 : 0001
3 : 0011
1 : 0001
2 : 0010

lsb bit: 0 ^ 1 ^ 1 ^ 1 ^ 0 : 1 
2nd bit: 1 ^ 0 ^ 1 ^ 0 ^ 1 : 1 
3rd bit: 0 ^ 0 ^ 0 ^ 0 ^ 0 : 0 
4th bit: 0 ^ 0 ^ 0 ^ 0 ^ 0 : 0

所以我们缺少的号码是

  

0011 = 3

答案 1 :(得分:3)

您可以在this question中找到更多通用答案。如果你假设n=2, m=1,你会得到你想要的。

但是,正如st0le所说,在你的情况下XOR应该足够了。

答案 2 :(得分:0)

如果我正确理解了这个问题,你就会得到一个包含奇数个整数值的数组,它由两个出现两次的整数和一个只出现一次的整数组成。例如,数组可能如下所示:

[3, 41, 6, 6, 41]

其中6和41都重复,3是唯一的。

知道是否还有其他限制会很好。例如:

  1. 数组是否排序? (如果是这样,这是一个在O(N)时间内解决的简单问题,无需临时存储。)
  2. 不成对的整数可以与一对中的整数相同吗?例如是[1, 2, 2, 2, 1]一个有效的输入,是一对1,一对2和一个不成对的2?
  3. 假设数组没有排序,这里有一个以伪代码表示的解决方案,该解决方案在O(N)时间内运行,并且最多只需要原始数组的一半存储空间。

    SEEN = []
    for N in ARRAY:
        if N in SEEN:
            remove N from SEEN
        else:
            add N to SEEN
    
    if size of SEEN != 1:
        error - ARRAY doesn't contain exactly 1 un-paired value
    else:
        answer = SEEN[0]
    

    这是一个使用NSMutableDictionary来存储看到的值的示例实现,假设源数组是纯C数组。

    #import <Foundation/Foundation.h>
    
    int main(int argc, char argv[]) {
        NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
        int array[9] = {3, 4, 5, 6, 7, 6, 5, 4, 3};
    
        NSMutableDictionary *d = [NSMutableDictionary dictionaryWithCapacity:16];
    
        for (int i = 0; i < sizeof(array)/sizeof(int); i++) {
            NSNumber *num = [NSNumber numberWithInt:array[i]];
            if ([d objectForKey:num]) {
                [d removeObjectForKey:num];
            } else {
                [d setObject:[NSNull null] forKey:num];
            }
        }
    
        if ([d count] == 1) {
            NSLog(@"Unpaired number: %i", [[[d keyEnumerator] nextObject] intValue]);
        } else {
            NSLog(@"Error: Expected 1 unpaired number, found %u", [d count]);
        }
    
    
        [pool release];
        return 1;
    }
    

    这里正在运行:

    $ gcc -lobjc -framework Foundation -std=c99 demo.m ; ./a.out 
    2010-12-25 11:23:21.426 a.out[17544:903] Unpaired number: 7