Zadanie 1 Mediana - Najlepszy Java Developer

Zadanie

Pierwszym rozruchowym zadaniem jest znalezienie mediany dla liczb zmiennoprzecinkowych. 😉

Czym jest mediana

Szybkie przypomnienie czym jest mediana.

Jest to wartość średniej arytmetycznej dwóch środkowych elementów zbioru uporządkowanego, w przypadku, gdy zbiór ma liczbę elementów nieparzystą to wtedy wybieramy element środkowy.

Przykład

1. Mając zbiór:

1, 4, 6, 9

To mediana jest równa: (4 + 6)/ 2 = 5

2. Mając zbiór z nieparzystą ilością elementów;

1, 4, 10

To mediana jest równa 4.

Punktacja

Za to zadanie można otrzymać maksymalnie 150 expa.

Przygotowanych jest pięć testów, za każdy zdany test otrzymasz 30 expa.

Termin

Zadanie zostało opublikowane 5 listopada 2018 roku, rozwiązania można przesyłać do 7 listopada 2018 roku do godziny 23:59. Zadania wysłane później będą automatycznie usuwane.

Format

Zadanie należy wysłać na email: njd@1024kb.pl z tematem: TWÓJ-NICK_MDN.

Wystarczy wysłać w załączniku tylko plik również o nazwie TWÓJ-NICK_MDN.java, którego szablon możesz pobrać stąd.

 

Rozwiązanie

Zróbmy małe podsumowanie zadania: rozwiązanie przesłało 18 osób, niestety to jest tylko ~30% – choć duże prawdopodobieństwo, że osoby później zapisane nie wiedziały o pierwszym zadaniu. Zobaczymy jak będzie z kolejnymi.

Moje przykładowe rozwiązania zadania wygląda tak:

import java.util.Arrays;

public class Median {
    static void sort(float [] numbers) {
        for(int i=0;i<numbers.length;i++) {
            for(int j=1;j<numbers.length;j++) {
                if (numbers[j-1] > numbers[j]) {
                    final float temp = numbers[j-1];
                    numbers[j-1] = numbers[j];
                    numbers[j] = temp;
                }
            }
        }

    }

   public static float median(float [] numbers) {
        final int size = numbers.length;
        if (size == 0) {
            throw new IllegalArgumentException("You have to type any numbers.");
        }
        // opcjonalnie - użycie własnego algorytmu sortowanie
        // preferowane użycie wbudowanych metod, których złożoność obliczeniowa jest mniejsza
        //sort(numbers);
        Arrays.sort(numbers);
        return size % 2 == 0 ? (numbers[(size-1)/2] + numbers[size/2]) / 2.0f : numbers[size/2];
    }
    
    public static void main(String[] args) {
        float median = median(new float[]{1.0f, 3.0f, 2.0f, 1.0f});
        System.out.println("Mediana: " + median);
    }
}

Na początku sprawdzam, czy aby na pewno tablica ma liczby – podałem to jako przykład, że warto pamiętać o sprawdzaniu takiego przypadku w kolejnych zadaniach. W tym zadaniu nie brałem tego pod uwagę, ze względu, że nie powiedziałem o tym w treści zadania.

Za każdy  zdany test gracz otrzymał 30 expa, testy wyglądały tak:

import org.junit.Assert;
import org.junit.Test;
import pl.maniaq.Median;

public class TestMedian {

    @Test
    public void firstMedianTest() {
        //is
        float numbers[] = {-2.1f,  -.7f, 1.5f, .0f,136.5f, 4.0f, .3f,  800.3f};

        //when
        float result = Median.median(numbers);

        //expected
        Assert.assertEquals(.15f, result, 0);
    }

    @Test
    public void secondMedianTest() {
        //is
        float numbers[] = {100.001f, 102.03f, -23.4f, -17.8f, 400.0f};

        //when
        float result = Median.median(numbers);

        //expected
        Assert.assertEquals(100.001f, result, 0);
    }

    @Test
    public void thirdMedianTest() {
        //is
        float numbers[] = {-2004.5f, 0.0001f, -0.001f, -14894.1f};

        //when
        float result = Median.median(numbers);

        //expected
        Assert.assertEquals(-1002.2505f, result, 0);
    }

    @Test
    public void fourthMedianTest() {
        //is
        float numbers[] = {.0f, -483.5f};

        //when
        float result = Median.median(numbers);

        //expected
        Assert.assertEquals(-241.75f, result, 0);
    }

    @Test
    public void fifthMedianTest() {
        //is
        float numbers[] = {0.7f};

        //when
        float result = Median.median(numbers);

        //expected
        Assert.assertEquals(.7f, result, 0);
    }

}

Kilku osobom nie przeszły wszystkie testy, warto uruchomić swój algorytm dla tych danych wejściowych i zobaczyć jak zachowuje się Wasz program. Według mnie najważniejszą częścią zadania jest wyciąganie wniosków. 😉

Uczulam na to, aby pliki były podawane w załączniku w ustalonym formacie tj. z odpowiednią nazwą! Usprawnia to proces sprawdzania i pozwala na uniknięcie pomyłki przy wpisywaniu wyniku.

Proszę, wpisuje swój nick, który podaliście podczas rejestracji na https://njd.1024kb.pl.

Kolejne zadanie pojawi się już 9 listopada.

Gratuluję wszystkim podjęcia zadania i życzę powodzenia w kolejnym! 😉

 

Kamil Klimek

Od 2016 jestem programistą Java. Przez pierwsze 4 lata pracowałem jako Full Stack Java Developer. Później postanowiłem postawić nacisk na Javę, żeby jeszcze lepiej ją poznać.

Subscribe
Powiadom o
guest
0 komentarzy
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x