从数组中删除奇数出现值

时间:2019-11-20 14:00:53

标签: java

https://app.codility.com/demo/results/trainingCP6965-NRG/

import java.util.*;

    class Solution {
          public int solution(int[] A) {

            ArrayList<Integer> B = new ArrayList<Integer>();

            for(int i = 0 ; i < A.length ; i++){
                B.add(A[i]);
            }

            while(B.size() != 1){

                for(int j = 1; j <B.size();j++){

                    if(B.get(0) == B.get(j)){
                        B.remove(j);
                        B.remove(0);
                        break;
                    }

                    if(j == B.size()-1 && B.get(0) != B.get(j)){
                        return B.get(0);
                    }
                }
            }

            return B.get(0);
        }
    }

我可以通过,直到正确性测试(n = 601)为止。 但由于答案错误,我无法通过性能测试。
所以我想知道为什么我的代码是错误的。
https://app.codility.com/programmers/lessons/2-arrays/odd_occurrences_in_array/

2 个答案:

答案 0 :(得分:1)

由于嵌套循环,您的代码的运行时间为O(n^2),因此对于大型输入而言,这太慢了。

在外循环的每次迭代中,您都会检测并消除一对相等的元素。这意味着该循环将有(n-1)/ 2次迭代。

您的内部循环可能会在每次迭代中遍历数组的所有其余元素,因此在最坏的情况下,内部循环的第一次执行将进行n次迭代,第二次将进行n-2次迭代,依此类推

因此,总运行时间受

约束
n + n - 2 + n - 4 + ... + 3 = (n + 3)*(n - 1)/4 = O(n^2)

我建议您使用HashSet<Integer>存储遇到的元素(如果不存在),并删除它们(如果存在)。这将花费线性时间(O(n))。

class Solution {
    public int solution(int[] A) {
        Set<Integer> set = new HashSet<Integer>();
        for(int i = 0; i < A.length; i++){
            if (!set.add(A[i])) { // add will return false if A[i] is already in the Set,
                                 // in which case we know we found a pair of equal numbers,
                                 // so we remove that number
                set.remove(A[i]);
            }
        }
        return set.iterator().next(); // according to the problem description, there should 
                                      // be exactly one element left
    }
}

答案 1 :(得分:0)

一种更快的解决方案是使用按位XOR(^)

class Solution {
    public int solution(int[] A) {
        int result = 0;
        for(int i = 0; i < A.length; i++){
            result = result ^ A[i];
        }
        return result;  
    }
}