Если у вас есть запасы, которые не могут быть разумно операции XOR (Big Целые или номера представлены в виде строк, например), альтернативный подход, который также является O (п), (но O (n) пространство, а не O (1) пространство) было бы просто использовать хеш-таблицу. Алгоритм выглядит следующим образом:
Create a hash table of the same size as the list
For every item in the list:
If item is a key in hash table
then remove item from hash table
else add item to hash table with nominal value
At the end, there should be exactly one item in the hash table
Я хотел бы сделать код, C или C++, но ни один из них хэш-таблицы встроенный (Не спрашивайте меня, почему C++ не имеет хэш-таблицу в STL,. но имеет хэш-карту, основанную на красно-черном дереве, потому что я понятия не имею, о чем они думают.) И, к сожалению, у меня нет компилятора C# для проверки синтаксических ошибок, поэтому я даю вам Java-код. Однако это очень похоже.
import java.util.Hashtable;
import java.util.List;
class FindUnique {
public static <T> T findUnique(List<T> list) {
Hashtable<T,Character> ht = new Hashtable<T,Character>(list.size());
for (T item : list) {
if (ht.containsKey(item)) {
ht.remove(item);
} else {
ht.put(item,'x');
}
}
return ht.keys().nextElement();
}
}
@Prasoon: хорошее решение, Prasoon :-) – Nawaz
@Nawaz: :) [.....] –
@Prasoon: Кстати, это функция шаблона необходима? 'sizeof (a)/sizeof (a [0])' недостаточно? – Nawaz