Najlepszy Java Developer – Zadanie 1: Mediana

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! 馃槈