This is probably the fastest you can do it in Java using HotLick’s suggestion in the comments. It makes the assumption that b.length == a.length + 1
so b is the larger array with the extra “unique” element.
public static int getUniqueElement(int[] a, int[] b) {
int ret = 0;
int i;
for (i = 0; i < a.length; i++) {
ret = ret ^ a[i] ^ b[i];
}
return ret ^ b[i];
}
Even if the assumption cannot be made, you can easily expand it to include the case where either a or b can be the larger array with the unique element. It’s still O(m+n) though and only loop/assignment overhead is reduced.
Edit:
Due to details of language implementation, this is still (surprisingly) the fastest way to do it in CPython.
def getUniqueElement1(A, B):
ret = 0
for a in A: ret = ret ^ a
for b in B: ret = ret ^ b
return ret
I have tested this with the timeit
module and found some interesting results. It turns out that the longhand ret = ret ^ a
is indeed faster in Python than the shorthand ret ^= a
. Also iterating over the elements of a loop is much much faster than iterating over the indexes and then making subscript operations in Python. That is why this code is much faster than my previous method where I tried to copy Java.
I guess the moral of the story is that there is no correct answer because the question is bogus anyways. As the OP noted in another answer below, it turns out you can’t really go any faster than O(m+n) on this and his teacher was just pulling his leg. Thus the problem reduces to finding the fastest way to iterate over all elements in the two arrays and accumulating the XOR of all of them. And this means it’s entirely dependent on language implementation, and you have to do some testing and playing around to get the true “fastest” solution in whatever implementation you are using, because the overall algorithm will not change.