【问题标题】:High efficient algorithm for picking up number from array从数组中取数的高效算法
【发布时间】:2010-12-25 09:22:30
【问题描述】:

问题来了:

一个数组有2*N+1个整数,有N对int数,即两个1,或者两个3等,所以只有一个int数,没有对。

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

感谢任何线索或 cmets。

【问题讨论】:

  • 数字有范围吗?即它们都小于 2*n?
  • 在构建数组时可以存储索引/编号吗?数组中的数字之间有关系吗?
  • 只是xor他们都......
  • @st0le 呵呵,确实很聪明。是否愿意将其添加为答案?
  • @st0le:呵呵,我本来打算建议使用哈希集,但你说得对,XOR 要好得多! :-)

标签: c++ objective-c algorithm


【解决方案1】:

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

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

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

那么这里发生了什么?比如说,我们有[2,1,3,1,2],对于那些熟悉异或运算符的人来说,知道1 ^ 1 = 00 ^ 0 = 0,和1 ^ 0 = 10 ^ 1 = 1(记住没有进位)

所以本质上,当我们对一个位序列 (100110111) 进行异或运算时,它有偶数个 1,每个位都会异或到零...如果 1's 的数量是奇数,异或会产生一个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

【讨论】:

  • @Saeed,Common,星期六+圣诞节,你期待什么?哈哈:P
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

    [3, 41, 6, 6, 41]
    

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

    如果有任何其他限制,最好知道。例如:

    1. 数组是否已排序? (如果是这样,这是一个在 O(N) 时间内解决的简单问题,不需要临时存储。)
    2. 不成对的整数可以与成对的整数相同吗?例如[1, 2, 2, 2, 1] 是一个有效的输入,是一对 1、一对 2 和一个不成对的 2?

    假设数组没有排序,这里有一个解决方案,用伪代码表示,运行时间为 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
    

    【讨论】:

      猜你喜欢
      • 2020-04-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-22
      • 2012-12-05
      • 2013-07-04
      • 1970-01-01
      • 2010-09-09
      相关资源
      最近更新 更多