JAVA - Prośba o intepretacje krótkiego kodu.

0

Witam,
Jest to mój pierwszy post na tym forum, więc witam wszystkich forumowiczów :)
Mam prośbę, czy ktoś mógłby przeanalizować oraz zinterpretować dla mnie ten kod?

 
class Solution {
    public boolean solution(int[] A) {
   int max = A[0], maxIndex = 0;
    for(int i=0;i<A.length;i++)
    {
        if(A[i] > max)
        {
            max = A[i];
            maxIndex = i;
        }
    }
			for(int j=0;j<maxIndex;j++)
			{
				if(A[j]>max)
					return false;
			}

    for(int j=maxIndex+1;j<A.length-1;j++)
    {
        if(!(max > A[j] && A[j+1] <A[j]))
            return false;
    }

    return true;
}
}

Wiem, że 1sza pętla to znajdowanie maksymalnego elementu oraz indeksu tego elementu. Natomiast co się dzieje w 2 kolejnych pętlach? 2 pętla to w ogóle kosmos - sprawdzamy czy nie ma elementu większego od maksymalnego, który przed chwilą znaleźliśmy przecież to bez sensu...

2

Potwierdzam, kod jest bez sensu. Drugą pętlę można wyrzucić bo warunek nigdy nie będzie spełniony. Trzecia pętla też jest lekko bez sensu bo można warunek uprościć do if(!(A[j+1] <A[j])) czyli if(A[j+1] > A[j]), czyli ta pętla sprawdza czy elementy, które w tablicy są "za" elementem największym, są ustawione w kolejności rosnącej.

0

Rozumiem, funkcja miala zwracac true wtedy gdy tablica jest posortowana rosnąco lub można uzyskać tablicę posortowaną rosnąco dokonując tylko 1 zamiany elementu, w przeciwnym razie miala zwracac false (gdy tablica nie jest posortowana rosnąco oraz nie będzie gdy dokonamy 1 zamiany elementów). Czyli ta funkcja to realizuje tylko niepotrzebnie jest ta 2 pętla?

2

Jeżeli w tym kodzie byłoby stosowane odpowiednie nazewnictwo, formatowanie i chociażby listy zamiast tablic, to nie trzeba by go analizować, tylko od razu wiedzielibyśmy, o co chodzi.
Np. klasa "Solution". Solution of what? Natomiast nazwa metody powinna być czasownikiem, a nie rzeczownikiem. Gdyby jeszcze wyciągnąć warunki z instrukcji do zmiennych, które coś mówią, to wtedy od razu ten kod stałby się bardziej przejrzysty.

Mój post nie odpowiada na Twoje pytanie, ale pokazuje kilka istotnych problemów. Gdyby je wyeliminować, to prawdopodobnie w ogóle nie musiałbyś tworzyć takiego wątku. Utrzymywanie czegoś takiego w przyszłości, to dramat.

0

To cenne uwagi, a dlaczego lepiej używać list?

0

Dałoby rade po polsku w swoich słowach po krótce? :D

0

@Shalom chyba jednak nie bardzo. Zalóżmy, że w tablicy A sa elementy: 4, 7, 7, 6. Wtedy:

  1. maxIndex będzie równe 1
  2. Warunek, który zaproponowałeś czyli
!(A[j+1] < A[j])

Da w wyniku false, podczas gdy warunek w pierwotnej postaci czyli:

!(max > A[j] && A[j+1] < A[j])

Da w wyniku true. Ponadto wyrażenia:

if(!(A[j+1] < A[j]))

i

if(A[j+1] > A[j])

Nie są tożsame. Byłyby gdybyś w drugim przypadku napisal ">=" a nie ">".

Co do pierwotnego kodu to metoda "solution" juz w pierwszej linijce zaklada, ze w tablicy sa jakies elementy - lepiej sobie takich zalozen nie robic.

0

Ale poza tym jest to poprawny kod [ten z 1 postu?] zwraca true dla posortowanej tablicy lub takiej ktora moze byc posortowana po przestawieniu 1 elementu?

0

A takie mialy byc zalozenia? Bo jezeli takie to raczej nie dziala to dobrze. Wystarczy, ze w tablicy znalazlyby sie takie elementy jak: 3, 2, 1, 8. Wtedy tablica nie jest posortowana a metoda zwroci true. Pierwszy for znajdzie maksimum czyli element tablicy o indeksie 3, drugi for jest bez sensu a zawartosc trzeciego sie nie wykona poniewaz maxIndex+1 jest wieksze niz A.length-1.

Ponieważ tablica nie jest ani posortowana ani nie można jej posortować przestawiająć tylko jeden element (trzeba przestawić dwa) metoda powinna zwrocić false. O ile rzeczywiście dobrze zrozumiałem założenia.

0

To ja już nic nie rozumiem, bo to był taki test online do wykonania i dla tego kodu który wstawiłem dało mi odpowiedź że jest dobrze :/
PS. Tak takie są założenia.

1

Dałoby rade po polsku w swoich słowach po krótce?

Jak chcesz być programistą bez znajomości angielskiego to trochę lipka ;)

0

Chyba się w ogóle do tego nie nadaje i źle wybrałem studia.

0
masiw napisał(a):

To ja już nic nie rozumiem, bo to był taki test online do wykonania i dla tego kodu który wstawiłem dało mi odpowiedź że jest dobrze :/

A na pewno chodzilo o przestawienie co najwyzej jednego elementu? Moze chodzilo o zamiane elementow co najwyzej jeden raz? Pytam bo to nie to samo.

0

Haha jaka motywacja, prawda jest taka, że poszedłem na informatyke bo myślałem, że będzie cokolwiek z grafiki komputerowej w której jestem samoukiem i chyba mi to idzie lepiej niż programowanie ale dzięki za motywacje :D mógłby ktoś w skrócie napisać czego listy są 'lepsze' od tablic? W javie jest więcej funkcji gotowych do działania na listach? Listy mogą przechowywać rózne typy? Czy to nie o to chodzi. Z moim angielskim nie jest najgorzej [gorzej z programowaniem :D] ale jak wjeżdzają takie specjalistyczne rzeczy jak programowanie to nie znam co drugiego słowa.

PS. TK: Chodziło chyba o zamiane elementow co najwyzej jeden raz. Tak kminie i nie widze roznicy pomiedzy tym :/

0
masiw napisał(a):

prawda jest taka, że poszedłem na informatyke bo myślałem, że będzie cokolwiek z grafiki komputerowej [...] ale jak wjeżdzają takie specjalistyczne rzeczy jak programowanie to nie znam co drugiego słowa.

Nie wyobrażam sobie, że ktoś poszedł na studia informatyczne i nie rozumie podstaw informatyki.
Ja też niby skończyłem specjalność grafika, ale nie spodziewałem się, że mnie minie programowanie czy inne podstawowe elementy informatyki. Jak to powiedział mój profesor:
"Wy jako inżynierowie informatyki nie możecie nie wiedzieć jak działa komputer lub internet".

0

@masiw rozbij to sobie na kilka prostych metod to będzie Ci prościej. np. tak czy jest posortowana:

    public static boolean isSorted(int array[]) {
        boolean sorted = true;
        for (int i = 0; sorted && i < array.length - 1; ++i) {
            sorted = array[i] <= array[i + 1];
        }
        return sorted;
    }
0
masiw napisał(a):

PS. TK: Chodziło chyba o zamiane elementow co najwyzej jeden raz. Tak kminie i nie widze roznicy pomiedzy tym :/

Chodzilo mi o to, ze jezeli masz elementy: 3, 2, 1, 8 to zeby posortowac te tablice nalezy przestawic dwie liczby 3 i 1. Przestawienie tych dwoch liczb to JEDNA zamiana miejscami i wtedy dla takich danych testowych metoda, ktora tutaj umiesciles dzialalaby dobrze. Z drugiej jednak strony dla danych 3, 2, 1, 3, 2, 1, 8 i tak dzialalaby niepoprawnie. Jezeli nie musisz poprawiac tego co napisales bo jakis tam test online jest podstawa do wystawienia pozytywnej oceny to pewnie i tak to olejesz. Jednak gdybys chcial napisac to poprawnie to zrob to mniej-wiecej tak:

  1. Stworz sobie pomocnicza metode, ktora zwraca true jezeli dane sa posortowane lub false w przeciwnym przypadku. W pierwszych linijkach sprawdz:

a) Czy tablica jest pusta - jezeli tak to zwracasz true (zalozylem, ze pusta tablica to tablica posortowana - nie wiem na ile to sluszne zalozenie. Jezeli nie jest to sluszne zalozenie to wtedy zawsze mozesz rzucic wyjatkiem).

b) Czy tablica posiada tylko jeden element - jezeli tak to tablica musi byc posortowana i zwracasz true.

c) Warto tez sprawdzić czy parametr nie jest null-em - sam zdecyduj co wtedy zrobic.

Jezeli tablica zawiera co najmniej 2 elementy (nie sa spelnione zalozenia z powyzszych podpunktow) to wtedy sprawdzasz wszystko for-em dla i <0, do length-1). Jeżeli zostanie spełniony warunek A[i] > A[i+1] to zwracasz false. Za forem wstaw return true.

  1. W metodzie wlasciwej (u Ciebie metoda solution) najpierw sprawdzasz czy dane sa juz posortowane (za pomoca metody pomocniczej). Jezeli sa, to zwracasz true, jezeli nie sa to wykonujesz nastepny krok.

  2. Tworzysz sobie dwa for-y (drugi for powinien znajdować się wewnątrz pierwszego). Pierwszy dla i z przedzialu <0, do length-1), a drugi dla j z przedzialu od <i+1, do length). Zamieniasz wtedy wartość A[i] z A[j] (warto sobie pomoc zmienną tymczasową). Po zamianie sprawdzasz za pomocą metody pomoczniczej czy tablica jest posortowana. Jezeli jest to zwracasz true, jeżeli nie jest nie zwracasz nic (nie przerywasz dzialania algorytmu).

  3. Bez wzgledu na to czy tablica jest posortowana w pkt. 3 czy nie jest powinienes przywrocic tablice do pierwotnej postaci, najlepiej od razu po ww. sprawdzeniu.

  4. Metoda wlasciwa powinna zwracac domyslnie false.

Powinno dzialac poprawnie, nie wiem natomiast czy akurat optymalnie

1 użytkowników online, w tym zalogowanych: 0, gości: 1