如果我正确理解了这个问题,您会得到一个包含奇数个整数值的数组,该数组由多个出现两次的整数加上一个只出现一次的整数组成。例如,数组可能如下所示:
[3, 41, 6, 6, 41]
其中 6 和 41 都是重复的,而 3 是唯一的。
如果有任何其他限制,最好知道。例如:
- 数组是否已排序? (如果是这样,这是一个在 O(N) 时间内解决的简单问题,不需要临时存储。)
- 不成对的整数可以与成对的整数相同吗?例如
[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