Nếu bạn có số lượng mà không thể được XORed hợp lý (Big Số nguyên hoặc số đại diện như Strings, ví dụ), một cách tiếp cận thay thế mà cũng là O (n) thời gian, (nhưng O (n) không gian thay vì O (1) không gian) sẽ chỉ đơn giản là sử dụng một bảng băm. Thuật toán trông giống như:
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
Tôi sẽ làm, mã C hoặc C++, nhưng cả hai đều không có bảng băm được tích hợp. (Đừng hỏi tại sao C++ không có bảng băm trong STL, nhưng không có bản đồ băm dựa trên cây đỏ đen, bởi vì tôi không biết họ đang nghĩ gì.) Và, thật không may, tôi không có trình biên dịch C# để kiểm tra lỗi cú pháp, vì vậy tôi sẽ cung cấp cho bạn Mã Java. Nó khá giống nhau, mặc dù.
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();
}
}
Nguồn
2011-01-23 08:56:32
@Prasoon: giải pháp tốt, Prasoon :-) – Nawaz
@Nawaz: :) [.....] –
@Prasoon: tiện đây, mẫu chức năng có cần thiết không? 'sizeof (a)/sizeof (a [0])' là không đủ? – Nawaz