在数组中查找不成对的数字

时间:2012-03-10 14:45:45

标签: java arrays

我有一个数组,其中除了一个重复所有元素:

int[] a={2,6,6,2,4,1,4};

如何找到未配对的元素整数?

3 个答案:

答案 0 :(得分:20)

您可以采取一些方法:

  • 方法1 - O( n log n ):对数组进行排序。然后,迭代排序数组的元素,一次两个(i=0i=2等)。如果a[i]a[i+1]不相等 - 或i+1 == a.length - 您知道a[i]未配对。
  • 方法2 - O( n 2 ):迭代元素。对于每个元素a[i],迭代元素(在嵌套循环中)并查看a[i] == a[j]i != j之间是否一直发生。如果没有,则a[i]已取消配对。
  • 方法3 - O( m ),其中 m 是最大元素和最小元素之间的差异(注意 m 是Ω( n )):迭代元素,找到最大值和最小值MINMAX。创建int[] b = new int[MAX-MIN+1]。再次迭代元素,为每个元素递增b[a[i]-MIN]。然后迭代b;当您找到b[j]==1时,j已取消配对。

注意:您使用术语“元素整数”,但这不是一个真正的术语。以上假设您的意思是“整数值元素”。如果您实际上是指“element index ”,则只能使用方法2而无需修改。方法3需要进行一些调整,方法1需要进行大量调整。 (当然,一旦你发现只出现一次,你可以再次遍历数组以找到该值的 index - 如果你仍然有原始的数组顺序。)


编辑添加:我不知道我之前是如何错过的 - 我想我在编写Java时不习惯按位操作 - 但最好的解决方案实际上是:

  • 方法4 - O( n ):计算数组所有元素的按位-XOR ^。这是不成对的元素。你看,XOR是可交换和关联的,所以2^6^6^2^4^1^41^(2^2)^(4^4)^(6^6)相同;并且x^x始终为0,因此这些对总是取消其他对。你可以写:

    int result = 0;
    for(int i : a)
        result ^= i;
    

    计算未配对的元素。 (要获取未配对元素的索引,您需要再次遍历数组,查找result。)

答案 1 :(得分:1)

您可以使用地图来计算看到一个数字的次数。无疑有更好的方法,但它会起作用。

public static void main( String[] args ) {
    int[] a = { 2, 6, 6, 2, 4, 1, 4 };

    Map<String, Integer> counts = new HashMap<String,Integer>();

    String key;
    for ( int i : a ) {
        key = String.valueOf( i );
        if ( counts.containsKey( key ) ) {
            int count = counts.get( key );
            counts.put( key, ++count );
        }
        else {
            counts.put( key, 1 );
        }
    }

    for ( Map.Entry<String, Integer> entry : counts.entrySet() ) {
        if ( entry.getValue() < 2 ) {
            System.out.println( entry.getKey() + " does not have a pair" );
        }
    }
}

答案 2 :(得分:0)

在codility示例中列出了一个示例,我在该示例中进行了测试,发现某些测试用例的正确性也很差