РЕДАКТИРОВАТЬ. Для кого-то нового в этом вопросе я опубликовал ответ, разъясняющий, что происходит. Принятый ответ - тот, который я считаю лучшим ответом на мой вопрос, как изначально опубликовано, но для получения дополнительной информации см. Мой ответ.
ПРИМЕЧАНИЕ. Эта проблема была изначально псевдокода и использованных списков. Я адаптировал его к Java и массивам. Поэтому, хотя мне бы хотелось увидеть какие-либо решения, которые используют специфические для Java трюки (или трюки на любом языке!), Просто помните, что исходная проблема не зависит от языка.
Проблема
Скажем, что есть два несортированных целочисленных массива a
и b
, с допустимым повторением элементов. Они идентичны (по отношению к содержащимся элементам), за исключением того, что один из массивов имеет дополнительный элемент. В качестве примера:
int[] a = {6, 5, 6, 3, 4, 2};
int[] b = {5, 7, 6, 6, 2, 3, 4};
Создайте алгоритм, который принимает в качестве входных данных эти два массива и выводит единственное уникальное целое число (в приведенном выше случае, 7).
Решение (до сих пор)
Я придумал это:
public static int getUniqueElement(int[] a, int[] b) {
int ret = 0;
for (int i = 0; i < a.length; i++) {
ret ^= a[i];
}
for (int i = 0; i < b.length; i++) {
ret ^= b[i];
}
return ret;
}
"Официальное" решение представлено в классе:
public static int getUniqueElement(int[] a, int[] b) {
int ret = 0;
for (int i = 0; i < a.length; i++) {
ret += a[i];
}
for (int i = 0; i < b.length; i++) {
ret -= b[i];
}
return Math.abs(ret);
}
Итак, оба концептуально делают то же самое. И учитывая, что a
имеет длину m и b
имеет длину n, то оба решения имеют время работы O (m + n).
Вопрос
Позже мне пришлось поговорить с моим учителем, и он намекнул, что есть еще более быстрый способ сделать это. Честно говоря, я не вижу, как; чтобы выяснить, уникален ли элемент, кажется, вам нужно хотя бы взглянуть на каждый элемент. При этом, по крайней мере, O (m + n)... right?
Так есть ли более быстрый способ? И если да, то что это?