codility абсолютное отличное количество от массива - PullRequest
11 голосов
/ 20 апреля 2011

поэтому я вчера прошел тест на собеседование и был проинформирован сегодня о том, что потерпел неудачу, к сожалению, ни администрация, ни работодатель не дали никакой другой информации о том, где я облажался, так что я был бы признателен за помощь в том, чтобы узнать, где я ошибся,я знаю, что codility уделяет большое внимание тому, как быстро работает программа и как она ведет себя в больших количествах.теперь я не копировал и вставлял вопросы, так что это приблизительно то, что я помню

  1. подсчитывает количество элементов в массиве, которые абсолютно различны, что это означает, если массив имел -3 и 3в нем эти числа не различны, потому что | -3 | = | 3 |.я думаю, что пример прояснит это лучше

a = {- 5, -3,0,1, -3} результат будет 4, потому что в этом массиве есть 4 абсолютно разных элемента.

В вопросе также указывалось, что a.length будет <= 10000, и, что наиболее важно, указывалось, что предполагается, что массив <strong>отсортирован в порядке возрастания , но я действительно не понимал, зачем нам нужноэто будет отсортировано

ЕСЛИ ВЫ ДУМАЕТЕ, ЧТО-ТО ЧТО-ТО ЗАПРОСИЛ, И Я ПОПРОБУЮ УДАЛИТЬ ВОПРОС ДАЛЬШЕ.

здесьмой код

import java.util.HashMap;
import java.util.HashSet;
import java.util.Set;


public class test2 {

    int test(int[] a){
        Set<Integer> s=new HashSet<Integer>();

        for(int i=0;i<a.length;i++){
            s.add(Math.abs(a[i]));

        }
        return s.size();

    }

    public static void main(String[] args) {
        test2 t=new test2();
        int[] a={1,1,1,2,-1};
        System.out.println(t.test(a));

    }

}

Ответы [ 31 ]

0 голосов
/ 08 февраля 2013

Самая короткая версия здесь для временной сложности O (n) и O (1) памяти:

int countAbsDistinct(int[] A) {
    int start = 0;
    int end = A.length - 1;
    if (end == -1) { // zero size list
        return 0;
    }

    int c = 1; // at least one abs distinct for non-empty array
    while(A[start]<A[end]){
        int l = Math.abs(A[start]);
        int r = Math.abs(A[end]);
    c++;

        if (r>=l){
            while(A[end]==list.get(--end)); // move left until different value
        }
        if (l>=r){
            while(A[start]==list.get(++start)); // move right until different value
        }
    }
    if(start>end){ // if last movements made start index bigger than end
        c--;
    }
    return c;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...