Если я правильно понял вопрос, у вас есть массив, содержащий нечетное число целочисленных значений, состоящее из числа целых чисел, которые появляются дважды, и одного целого числа, которое появляется только один раз.Например, массив может выглядеть так:
[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