我得到了一个未排序的整数数组,其中每个整数精确地出现两次,不包括一个只出现一次的整数。 我想用Java编写一个程序,找到只出现一次的整数。
这是我的尝试:
int findIntegerThatOccursOnce(int[] arr)
{
HashSet<Integer> hashSet = new HashSet<Integer>();
int mSum = 0;
for(int i = 0; i < arr.length; i++)
{
if(hashSet.contains(arr[i]))
{
mSum = mSum - arr[i];
}
else
{
hashSet.add(arr[i]);
mSum = mSum + arr[i];
}
}
return mSum;
}
我的教授说这是一个很好的尝试,但有一个更好的尝试使用更少的空间,但我看不出我怎么能用更少的空间做到这一点?任何人都可以帮忙解释空间问题吗?
答案 0 :(得分:1)
假设断言所有数字都出现两次,除了一个值,你可以xor所有值并返回结果。像,
static int findIntegerThatOccursOnce(int[] arr) {
int v = 0;
for (int i : arr) {
v ^= i;
}
return v;
}
答案 1 :(得分:0)
你的尝试需要 O(n)时间和 O(n)空间并且非常好,因为有许多更简单的简单解决方案“更糟”在时间和空间上。
如果在数组中的所有整数上使用Exclusive or (XOR),则可能占用较少空间的一种可能解决方案是;因为所有出现两次的整数都会取消。
这会给你一个只出现一次的整数。此解决方案将使用 O(1)空间。