编辑:对于这个问题的新手,我已经发布了一个答案,澄清了发生了什么。接受的答案是我认为最能回答我最初发布的问题的答案,但有关更多详细信息,请参阅我的答案。
注意:这个问题最初是伪代码和使用列表。我已经将它改编为 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)......对吗?
那么有没有更快的方法呢?如果是这样,那是什么?