Wpis z mikrobloga

Pytanie do #python i #programowanie. Funkcja ma przejrzec liste int i podac pierwszy int ktory ma swoja kopie w tej liscie. Jesli zaden numer sie nie powtarza, ma wyrzucic -1. Problem rowiazalem swoim sposobem, ale znalezlem 'polecana' funkcje. Zadanie z codefights. Jest mi ktos w stanie wytlumaczyc jak ta funkcja dziala, bo siedze nad tym od 20 minut i zrozumiec nie moge (dopiero zaczynam przygode z programowaniem).

def firstDuplicate(A):
....for x in A:
........A[abs(x) - 1] *= -1
........if A[abs(x) - 1] > 0:
............return abs(x)
....return -1
  • 12
@werteryzm: białe znaki ci zje wypokowe formatowanie kodu - daj kropki, podkreślenia albo linka do pastebina

a #!$%@?ąc od większości logiki, albo ja czegoś nie rozumiem, albo pierwszy rozkaz w pętli próbuje indeksować listę A po wartości absolutnej jednego z elementów a nie po indeksie listy, oczywiście pomniejszonej o 1 ale to nic nie zmienia.
@werteryzm: Ten kod chyba faktycznie jest bez sensu, albo ja nie rozumiem jak miał działać. Skompilowałem to i wrzuciłem jakiś array, który specjalnie miał w sobie liczbę większą niż długość tabeli i tak jak myślałem wywaliło indexError.
@PBL616: zdał wszystkie testy na stronie z której korzystam. To rozwiązanie jakiegoś ziomka, a żeby wrzucić rozwiązanie musi ono działać. Na 100% to jest jakis duży skrót który oszczędza pamięć i skraca czas iteracji ale nie potrafię go rozgryźć
@werteryzm: Nie, po prostu nie przepisałeś wszystkich warunków zadania:
https://medium.com/@joshsaintjacque/algorithms-exercise-find-the-first-duplicate-in-an-array-e97e9ed282c1

contains only numbers in the range from 1 to a.length


W tym przypadku działa to dobrze - jeśli po pomnożeniu przez -1 liczba jest dodatnia, to znaczy że już wcześniej była pomnożona przez -1, czyli jest duplikatem(o najmniejszym indeksie w tabeli). Pewnie nie doczytałeś dokładnie warunków zadania.