查找在Java中未排序的整数数组中出现一次的整数

时间:2017-06-01 02:24:23

标签: java arrays algorithm

我得到了一个未排序的整数数组,其中每个整数精确地出现两次,不包括一个只出现一次的整数。 我想用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;
}

我的教授说这是一个很好的尝试,但有一个更好的尝试使用更少的空间,但我看不出我怎么能用更少的空间做到这一点?任何人都可以帮忙解释空间问题吗?

2 个答案:

答案 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)空间。