Codility дал странный результат анализа алгоритма - PullRequest
0 голосов
/ 09 февраля 2020

Я пытался решить задачу 'OddOccurferencesInArray' с помощью c#, где нужно найти непарное целое число в данном массиве. Задача подготовлена ​​на app.codility.com в уроках следующим образом: «дан непустой массив A, состоящий из N целых чисел. Массив содержит нечетное количество элементов, и каждый элемент массива может быть спарен с другим элементом, имеющим такое же значение, за исключением одного элемента, который остается непарным. " Мое решение:

public int solution(int[] A) {
    int result=0;
    Array.Sort(A);
    for(int i=0;i<A.Length-1;i+=2){
        if(A[i]!=A[i+1]){
            result=A[i];
            break;
        }
    }
    return result;
}

Но встроенный анализ 'app.codility.com' говорит, что я сделал неправильно:

Correctness tests

▶ simple1 простой тест n = 5 ✘ НЕПРАВИЛЬНЫЙ ОТВЕТ получил 0 ожидаемых 4 ▶ simple2 простой тест n = 11 ✘ НЕПРАВИЛЬНЫЙ ОТВЕТ получил 0 ожидаемых 4 ▶ extreme_single_item [42] ✘ НЕПРАВИЛЬНЫЙ ОТВЕТ получил 0 ожидаемых 42 ▶ small1 маленький случайный тест n = 201 ✔ OK ▶ small2 маленький случайный тест n = 601 ✘ НЕПРАВИЛЬНЫЙ ОТВЕТ получил 0 ожидаемых 4242

Может ли кто-нибудь помочь мне в этом случае?

Обновление. Правильная форма моего решения:

public int solution(int[] A)
    {
        int result = 0;

        Array.Sort(A);

        if (A[A.Length - 2] != A[A.Length - 1])
        {
            return A[A.Length - 1];
        }

        for (int i = 0; i < A.Length - 2; i += 2)
        {
            if (A[i] != A[i + 1])
            {
                return A[i];
            }
        }

        return result;
    }

1 Ответ

0 голосов
/ 09 февраля 2020

Другое решение будет следующим:

public int solution(int[] A) {
    int result=0;

    foreach(var a in A){
        result = result ^ a;
    }

    return result;
}

Поскольку каждая пара с одинаковым номером даст 0.

...