Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 一种从数组中提取数字的高效算法_C++_Objective C_Algorithm - Fatal编程技术网

C++ 一种从数组中提取数字的高效算法

C++ 一种从数组中提取数字的高效算法,c++,objective-c,algorithm,C++,Objective C,Algorithm,问题是: 一个数组中有2*N+1个整数,有N对整数,即两个1或两个3等,因此只有一个整数,没有对 问题是如何用高效的算法找到这个数字 谢谢你的提示和评论 您可以在中找到更普遍的答案。如果你假设n=2,m=1,你就会得到你想要的 但是,正如st0le所说,在你的例子中,XOR应该足够了。如果我理解正确,你得到了一个包含奇数个整数值的数组,由若干个出现两次的整数加上一个只出现一次的整数组成。例如,数组可能如下所示: [3, 41, 6, 6, 41] 其中6和41都是重复的,3是唯一的 最好知道是

问题是:

一个数组中有2*N+1个整数,有N对整数,即两个1或两个3等,因此只有一个整数,没有对

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


谢谢你的提示和评论

您可以在中找到更普遍的答案。如果你假设n=2,m=1,你就会得到你想要的


但是,正如st0le所说,在你的例子中,XOR应该足够了。

如果我理解正确,你得到了一个包含奇数个整数值的数组,由若干个出现两次的整数加上一个只出现一次的整数组成。例如,数组可能如下所示:

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

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

  • 数组是否已排序?(如果是这样,这是一个简单的问题,可以在O(N)时间内解决,不需要临时存储。)
  • 未配对的整数能否与成对的整数相同?e、 g.
    [1,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]
    
    假设源数组是一个普通的C数组,下面是一个使用NSMutableDictionary存储可见值的示例实现

    #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;
    }
    
    好吧,好吧,这是我的评论的解释-/

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

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

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


    有数字的范围吗?i、 e所有这些都小于2*n?在构建阵列时是否可以存储索引/编号?数组中的数字之间有什么关系吗?只是
    xor
    它们都是…@st0le-Huh,确实很聪明。想补充一下吗?@st0le:heh,我本想建议使用散列集,但你是对的,XOR更好!:-)@赛义德,普通人,这是周六+圣诞节,你期待什么?哈哈:P
    missingNum = 0
    for each value in list
       missingNum = missingNum ^ value //^ = xor
    next
    print(missingNum)
    
    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