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/
答案 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;
}
}