【发布时间】:2015-05-19 17:34:39
【问题描述】:
我正在尝试解决算法问题。我需要在数组中找到一个整数
例如 {1,1,5,5,5,3,2,2}
输出应该是 3,因为这是那里唯一的单个整数。
到目前为止,我创建了一个算法,首先我对数组进行排序,然后检查 i-1 和 i+1 元素是否相等,如果不相等,则表示我只有一个。
问题是;对于短输入,它工作正常,但对于长输入,我会收到超时(计算时间太长,所以我的答案没有得到验证)。
你能给我一些改进算法的建议吗
static int lonelyinteger(int[] a) {
Arrays.sort(a);
if (a.length == 1)
return a[0];
for (int i = 0; i < a.length; ++i) {
if (i == 0) {
if (a[i + 1] != a[i])
return a[i];
} else if (i == a.length - 1) {
if (a[i] != a[i - 1])
return a[i];
} else {
if (a[i - 1] != a[i] && a[i + 1] != a[i])
return a[i];
}
}
return -1;
}
【问题讨论】:
-
举一个导致这种情况发生的输入示例。
-
你得到了什么确切的例外? (带堆栈)
-
您不需要对数组进行排序。遍历它一次,并构建一个你看到的每个数字的地图,以及你看到它的次数。然后用 counter == 1 打印数字。
-
你说的超时是什么意思?
-
map 的想法是可行的,但请记住,与就地排序相比,它所需的内存大约是三倍(取决于有多少单个条目和多个条目)。对于较小的 N 无关紧要,但对于相对于可用内存而言非常大的 N 会。