Biorąc pod uwagę tablicę, która zawiera tylko liczby w zakresie od 1 do a. Długości, znajdź pierwszą zduplikowaną liczbę, dla której drugie wystąpienie ma minimalny indeks. Innymi słowy, jeśli istnieje więcej niż 1 zduplikowana liczba, zwróć liczbę, dla której drugie wystąpienie ma mniejszy indeks niż drugie wystąpienie drugiej liczby. Jeśli nie ma takich elementów, twój program / funkcja może spowodować niezdefiniowane zachowanie.
Przykład:
Na a = [2, 3, 3, 1, 5, 2]
wyjście powinno być
firstDuplicate(a) = 3
.
Istnieją 2 duplikaty: liczby 2 i 3. Drugie wystąpienie 3 ma mniejszy indeks niż drugie wystąpienie 2, więc odpowiedź to 3.
Na a = [2, 4, 3, 5, 1]
wyjście powinno być
firstDuplicate(a) = -1
.
To jest golf golfowy , więc wygrywa najkrótsza odpowiedź w bajtach.
BONUS: Czy możesz to rozwiązać przy złożoności czasowej O (n) i dodatkowej złożoności przestrzennej O (1)?
źródło
Odpowiedzi:
Python 2 , 34 bajty
Czas O (n 2 ), przestrzeń O (n)
Zaoszczędź 3 bajty dzięki @vaultah i 3 więcej z @xnor!
Wypróbuj online!
źródło
lambda l:l[map(l.remove,set(l))<0]
prace, nawet jeśli kolejność oceny jest dziwna.-1
gdy nie znaleziono duplikatów bez „kodu stopki”, czy ten kod nie jest wliczany do bajtów? Nie znam się na golfie, przepraszam, jeśli to podstawowe pytanie!JavaScript (ES6),
47363125 bajtówZaoszczędź 6 bajtów dzięki ThePirateBay
Zwraca,
undefined
jeśli nie ma rozwiązania.Złożoność czasowa: O (n) :-)
Złożoność przestrzeni: O (n) :-(
W jaki sposób?
Śledzimy już napotkane wartości, zapisując je jako nowe właściwości oryginalnej tablicy a za pomocą liczb ujemnych. W ten sposób nie mogą one zakłócać oryginalnych wpisów.
Próbny
Pokaż fragment kodu
źródło
a=>a.find(c=>!(a[-c]^=1))
Mathematica, 24 bajty
Możliwość dopasowania wzorców przez Mathematica jest taka fajna!
Zwraca oryginał
List
dla nieprawidłowych danych wejściowych.Wyjaśnienie
W danych wejściowych zastąp ...
A
List
ze zduplikowanym elementem, z 0 lub więcej elementami przed, pomiędzy i po duplikatach ...Ze zduplikowanym elementem.
źródło
Galaretka , 5 bajtów
Wypróbuj online!
Jak to działa
źródło
œ-
usuwa najbardziej odpowiednie wystąpienia? TIL-1
bez duplikatów. Zgłaszanie wyjątku jest w porządku jak na OP, ale nie jestem pewien, czy0
jest, mimo że nie jest w zasięgu.Haskell , 35 bajtów
Wypróbuj online! Awarie, jeśli nie znaleziono duplikatu.
źródło
Galaretka , 6 bajtów
Wypróbuj online!
Zwraca pierwszy duplikat lub 0, jeśli nie ma duplikatu.
Wyjaśnienie
źródło
ŒQi0ị
.i0
zwraca 0, gdzieị
indeksuje i zwraca ostatnią wartość danych wejściowych zamiast 0.Japt , 7 bajtów
Przetestuj online!
Wyjaśnienie
Alternatywnie:
Przetestuj online!
Wyjaśnienie
źródło
Pyth, 5 bajtów
Zestaw testowy
Usuń z Q pierwsze pojawienie się każdego elementu w Q, a następnie zwróć pierwszy element.
źródło
Dyalog APL,
27242019131211 bajtówTeraz zmodyfikowane, aby nie zależeć od wersji 16! Wypróbuj online!
W jaki sposób? (Z wejściem N )
⊢⊃⍨...
- N o tym indeksie:⍴↑∪
- N z usuniętymi duplikatami, prawy wyściełany,0
aby pasował do N.⊢=
- Równość elementarna z N0⍳⍨
- Indeks pierwszego0
. `źródło
⎕AV
, prawda?⎕U2378
podczas ładowania. Wypróbuj online!Python 3 ,
9492 bajtyO (n) czas i O (1) dodatkowa pamięć.
Wypróbuj online!
Źródło algorytmu .
Wyjaśnienie
Podstawową ideą algorytmu jest przebieganie przez każdy element od lewej do prawej, śledzenie pojawiających się liczb i zwracanie liczby po osiągnięciu liczby, która już się pojawiła, i zwracanie -1 po przejściu przez każdy element.
Jednak wykorzystuje sprytny sposób do przechowywania liczb, które się pojawiły, bez użycia dodatkowej pamięci: do przechowywania ich jako znaku elementu indeksowanego przez liczbę. Na przykład mogę przedstawić fakt, że
2
i3
już się pojawił, mająca[2]
ia[3]
ujemne, jeśli tablica jest indeksowana 1.źródło
i
przypadku, gdy [i]> n?1
a. Długość, ale dla [i] = a. Długość nie byłoby to poza zakresem?t=abs(a[i])-1=a.length-1
Perl 6 , 13 bajtów
Spróbuj
Wyjaśnienie
*
Znajduje się w położeniu Term więc cała wypowiedź jest WhateverCode lambda..repeated
Jest to metoda, która powoduje każdej wartości z wyjątkiem po raz pierwszy każda wartość widziano.[0]
zwraca tylko pierwszą wartość w Seq .Jeśli nie ma żadnej wartości, zwracane jest zero .
( Zero jest podstawą typów awarii , a wszystkie typy mają swoją własną niezdefiniowaną wartość, więc zero różni się od wartości niezdefiniowanej w większości innych języków)
Zauważ, że ponieważ implementacja
.repeated
generuje Seq , oznacza to, że nie zaczyna wykonywać żadnej pracy, dopóki nie poprosisz o wartość, i wykonuje tylko tyle pracy, aby wygenerować to, o co prosisz.Łatwo byłoby więc argumentować, że ma ona w najgorszym przypadku złożoność czasową O (n) , aw najlepszym razie złożoność czasową O (2), jeśli druga wartość jest powtórzeniem pierwszej.
Podobnie można powiedzieć o złożoności pamięci.
źródło
APL (Dyalog) , 20 bajtów
Wypróbuj online!
2⍴¯1
Negatywnym R eshaped do długości na listę⎕,
pobierz dane wejściowe (mnemonic: konsola) i do tego dołączn←
przechowuj to w n,\
przedrostki n (lit. kumulatywna konkatenacja)(
…)¨
Zastosuj następującą ukrytą funkcję do każdego prefiksu,
[to] ravel (zapewnia tylko, że prefiks jest listą)≢
różny od∪
unikalne elementy [?] (tj. czy prefiks ma duplikaty?)n/⍨
użyj tego do filtrowania n (usuwa wszystkie elementy, aż do pierwszego, dla którego znaleziono duplikat)⊃
wybierz z tego pierwszy elementźródło
APL (Dyalog) , 11 bajtów
Zgodnie z nowymi zasadami zgłasza błąd, jeśli nie ma duplikatów.
Wypróbuj online!
⍳⍨
wskaźniki pierwszego wystąpienia każdego elementu~
usunięte z⍳∘≢
wszystkich wskaźników⍬⍴
przekształć to w skalar (daje zero, jeśli żadne dane nie są dostępne)⊃⍨
użyj tego, aby wybrać (daje błąd na zero)⊢
argumentźródło
APL, 15
Wydaje się, że możemy zwrócić 0 zamiast -1, gdy nie ma duplikatów (dziękuję Adámowi za komentarz). A więc 3 bajty mniej.
Trochę opisu:
Dla porównania, stare rozwiązanie dodało -1 do listy na końcu, więc jeśli lista skończy się pusta, będzie zawierać -1, a pierwszym elementem będzie -1.
Wypróbuj na tryapl.org
źródło
¯1
, więc{⊃⍵[(⍳⍴⍵)~⍵⍳⍵]}
powinieneś to zrobić.Siatkówka ,
2624 bajtówWypróbuj online! Objaśnienie:
\b(\d+)\b
dopasowuje kolejno każdą liczbę, a następnie lookbehind sprawdza, czy liczba jest duplikatem; jeśli jest to1
st dopasowanie!
wyjściowe, a nie liczba dopasowań. Niestety, umieszczenie lookbehind na pierwszym miejscu nie wydaje się działać, w przeciwnym razie zaoszczędziłoby kilka bajtów. Edycja:Dodano 7 bajtów, aby były zgodne zZaoszczędź 2 bajty dzięki @MartinEnder.-1
wartością zwracaną przy braku dopasowania.źródło
-1
.MATL , 8 bajtów
Daje błąd (bez danych wyjściowych), jeśli nie istnieje duplikat.
Wypróbuj w MATL Online!
Wyjaśnienie
źródło
R, 34 bajty
Odetnij kilka znaków od odpowiedzi @djhurio, ale nie masz wystarczającej reputacji, aby komentować.
źródło
-1
ale dzięki nowej specyfikacji udało mi się jeszcze bardziej ją pograć w golfa. To jest wciąż solidne i to inne podejście niż sposób, w jaki to zrobił, więc dam ci +1!J,
1716 bajtówW jaki sposób?
źródło
R , 28 bajtów
Wypróbuj online!
źródło
NA
do brakujących wartości, ponieważ zmieniła się specyfikacja; więc(x=scan())[duplicated(x)][1]
jest całkowicie poprawny.J , 12 bajtów
Wypróbuj online!
Wyjaśnienie
źródło
Dyalog APL Classic, 18 znaków
Działa tylko w
⎕IO←0
.Usuń z listy indeksów elementów argumentu poprzedzoną literą „-1” indeksy listy jego nub, a następnie wybierz pierwszy z pozostałych. Jeśli po usunięciu pozostaje tylko pusty wektor, jego pierwszym elementem jest z definicji 0, który służy do indeksowania rozszerzonego argumentu dającego pożądane -1.
źródło
¯1
, abyś mógł go usunąć¯1,
i użyć⎕IO←1
.Rubinowy ,
2836 bajtówZa pierwszym razem źle zrozumiałem wyzwanie.
O(n)
czas,O(n)
przestrzeń.Wypróbuj online!
źródło
Java (OpenJDK 8) ,
65117109 bajtówPoprzednie 65 bajtowe rozwiązanie:
Nowe rozwiązanie Uwzględniono 19 bajtów
import java.math.*;
-8 bajtów dzięki @Nevay
Wypróbuj online!
Edytować
Algorytm w moim oryginalnym programie był w porządku, ale statyczny rozmiar użytego typu danych oznaczał, że złamał się dość szybko, gdy rozmiar przekroczył określony próg.
Zmieniłem typ danych użyty w obliczeniach, aby zwiększyć limit pamięci programu, aby to uwzględnić (używając
BigInteger
dla dowolnej precyzji zamiastint
lublong
). To jednak sprawia, że dyskusyjne jest, czy liczy się to jakoO(1)
złożoność przestrzeni.Wyjaśnienia pozostawiam poniżej nietknięte, ale chciałbym dodać, że obecnie uważam, że niemożliwe jest osiągnięcie
O(1)
złożoności przestrzeni bez przyjęcia pewnych założeń.Dowód
Zdefiniuj
N
jako liczbę całkowitą taką, że2 <= N
.Niech
S
będzie listą reprezentującą serię losowych liczb całkowitych[x{1}, ..., x{N}]
, gdziex{i}
ma ograniczenie1 <= x{i} <= N
.Złożoność czasu (w notacji Big-O) wymagana do iteracji tej listy dokładnie raz na element
O(n)
Podane wyzwanie polega na znalezieniu pierwszej zduplikowanej wartości na liście. Mówiąc dokładniej, szukamy pierwszej wartości,
S
która jest duplikatem poprzedniego elementu na liście.Niech
p
iq
być pozycje dwóch elementów listy takie, żep < q
ix{p} == x{q}
. Naszym wyzwaniem staje się znalezienie najmniejszego,q
który spełnia te warunki.Oczywistym podejściem do tego problemu jest iteracja przez S i sprawdzenie, czy nasz
x{i}
istnieje na innej liścieT
: jeślix{i}
nie istniejeT
, przechowujemy goT
. Jeślix{i}
istniejeT
, to jest to pierwsza zduplikowana wartość, a zatem najmniejszaq
, i jako taka zwracamy ją. Ta efektywność przestrzeni wynosiO(n)
.Aby osiągnąć
O(1)
złożoność przestrzeni przy jednoczesnym zachowaniuO(n)
złożoności czasu, musimy przechowywać unikalne informacje o każdym obiekcie na liście w skończonej ilości miejsca. Z tego powodu jedynym sposobem na działanie dowolnego algorytmuO(1)
złożoność przestrzeni występuje, gdy: 1. N otrzymuje górną granicę odpowiadającą pamięci wymaganej do przechowywania maksymalnej liczby możliwych wartości dla określonego skończonego typu danych. 2. Ponowne przypisanie jednej niezmiennej zmiennej nie jest liczone do złożoności, a jedynie liczba zmiennych (lista zawiera wiele zmiennych). 3. (Na podstawie innych odpowiedzi) Lista jest (lub przynajmniej elementy listy są) zmienne, a typ danych listy jest wstępnie ustawiony jako liczba całkowita ze znakiem, co umożliwia wprowadzanie zmian w elementach znajdujących się dalej na liście bez użycia dodatkowej pamięci.1 i 3 wymagają zarówno założeń, jak i specyfikacji dotyczących typu danych, a 2 wymaga, aby do obliczenia złożoności przestrzeni brana była pod uwagę tylko liczba zmiennych, a nie wielkość tych zmiennych. Jeśli żadne z tych założeń nie zostanie zaakceptowane, osiągnięcie
O(n)
złożoności czasowej iO(1)
złożoności przestrzeni byłoby niemożliwe .Wyjaśnienie
Whoo boy, zajęło
to kłopotliwie dużo czasu, by wymyślićodrobinę mocy mózgu.Tak więc zdobycie bonusu jest trudne. Obaj musimy dokładnie operować na całej liście i śledzić wartości, które już iterowaliśmy, bez dodatkowej złożoności przestrzeni.
Manipulowanie bitami rozwiązuje te problemy. Inicjujemy nasze
O(1)
„przechowywanie”, parę liczb całkowitych, a następnie iterujemy listę, LUB-i-ity bit w naszej pierwszej liczbie całkowitej i zapisujemy ten wynik na drugim.Na przykład, jeśli mamy
1101
i wykonujemy operację LUB10
, otrzymujemy1111
. Jeśli zrobimy kolejną operację OR10
, nadal mamy1101
.Ergo, kiedy wykonamy operację OR i skończymy z tym samym numerem, znaleźliśmy nasz duplikat. Brak duplikatów w tablicy powoduje, że program uruchamia się i zgłasza wyjątek.
źródło
PHP,
56 44 3832 bajtyUruchom tak:
Wyjaśnienie
Poprawki
Złożoność
Jak można zauważyć w skomentowanej wersji kodu, złożoność czasowa jest liniowa
O(n)
. Pod względem pamięcin+1
zostanie przypisanych maksimum zmiennych. Więc to jestO(n)
.źródło
error_reporting
opcję do liczby bajtów (lub użyj-n
, która jest darmowa)./dev/null
potokować.O(1)
z dodatkową przestrzenią? Dosłownie przypisujesz nową zmienną pern
, czyliO(n)
Java 8,
827876 bajtówNie jest już wykonalne,756764 bajtów poniżej w edycjiJako funkcja lambda:
Prawdopodobnie można go znacznie zmniejszyć, to było bardzo szybkie.
Wyjaśnienie:
*Edytować*
756764 bajtów przy użyciu strategii negacji:Wypróbuj online!
(-3 bajty dzięki @Nevay)
Wyjaśnienie:
Pętle nad tablicą, negując śledzenie. Jeśli nie ma duplikatów, po prostu przejeżdża i generuje błąd.
Oba działają na złożoność czasu O (n) i przestrzeni O (n).
źródło
Number
, ponieważi
jest tolong
i-1
jestint
.long
, ale nie naLong
wymagane, aby lambda została przypisana doFunction
. Testowałeś to? Niezależnie od tego rozwiązanie to można zastąpić nowym.Set s=new HashSet();
aby zaoszczędzić 7 bajtów. (Poza tym: afaik importjava.util.*;
musi być uwzględniony w liczbie bajtów -> +19 bajtów.) Instrukcja return może byćreturn++j
, instrukcja if może zostać usuniętaa->{int i=0,j;for(;(a[j=Math.abs(a[i++])-1]*=-1)<0;);return++j;}
(-3 bajty).Brachylog , 5 bajtów
Wypróbuj online!
Wyjaśnienie
Wbudowany adfiks
a
wyświetla najpierw wszystkie prefiksy w kolejności rosnącej długości, a następnie sufiksy w kolejności malejącej długości. Zatem dane wyjściowe są wytwarzane przez najkrótszy prefiks, który pozwala na to, jeśli istnieje. Jeśli prefiks nie ma duplikatów, reszta programu zawiedzie, ponieważ każdy podsekwencja równych elementów ma długość 1, a pierwszy element jego ogona nie istnieje. Jeśli przedrostek ma powtarzający się element, możemy wybrać podsekwencję długości 2 zawierającą oba te elementy, a program zwraca ten drugi.źródło
a⊇Ċ=h
które dotyczy tylko podzbiorów długości-2.C #, 145 bajtów
Prawdopodobnie o wiele krótszy sposób, aby to zrobić w C # za pomocą prostej pętli, ale chciałem spróbować z Linq.
Wypróbuj online!
Wersja pełna / sformatowana:
źródło
Haskell ,
7869 bajtówWypróbuj online!
Zaoszczędzono 9 bajtów dzięki @nimi
Podstawowa ścieżka przez listę. Jeśli bieżący element nie był jeszcze widoczny (
i<0
) i znajduje się na liście akumulatorów (elem x a
), zapisz bieżący indeks. W przeciwnym razie zachowaj indeks -1. W każdym razie dodaj bieżący element do listy akumulatorów.EDYCJA : Nie przeczytałem pytania wystarczająco uważnie: ten kod wyświetla indeks drugiego elementu zduplikowanego elementu.
źródło
\ ... ->(last$i:[j|i<0,elem x a],x:a)
. Ponadto: nie ma potrzebyf=
, ponieważ dozwolone są funkcje bez nazw.Python 2,
7165 bajtówZwraca,
None
jeśli nie ma duplikatu elementuEdycja: -6 bajtów dzięki @ musicman523
Wypróbuj online!
O (n) złożoność czasu, O (n) złożoność przestrzeni, O (1) przestrzeń pomocnicza.
Ponieważ lista wejściowa wykorzystuje przestrzeń O (n) , złożoność przestrzeni jest przez to ograniczona. Oznacza to, że nie możemy mieć mniejszej złożoności przestrzeni niż O (n)
Zmienia oryginalną listę, jeśli nie jest to dozwolone, moglibyśmy to zrobić z tą samą złożonością przy 129 bajtach
Wyjaśnienie
Ponieważ każdy element jest większy od 0 i mniejszy lub równy rozmiarowi listy, lista ma dla każdego elementu a element na indeks a - 1 (0 indeksowany). Wykorzystujemy to, mówiąc, że jeśli element o indeksie i jest ujemny, to widzieliśmy go wcześniej.
Dla każdego elementu a na liście n, pozwalamy ci być ujemną wartością bezwzględną a. (Dajemy, aby było ujemne, ponieważ Python może indeksować listy z indeksami ujemnymi, a w innym przypadku musielibyśmy to zrobić
u=abs(a)-1
). Jeśli element o indeksie u na liście jest ujemny, widzieliśmy go wcześniej i dlatego możemy zwrócić -u (aby uzyskać wartość bezwzględna a, ponieważ wszystkie elementy są dodatnie) . W przeciwnym razie ustawiamy element przy indeksie u na wartość ujemną, aby pamiętać, że wcześniej widzieliśmy element wartości.źródło
1
in
, podobnie jak w przypadku jej podania, to oczywiście nie działa.Galaretka , 4 bajty
Wypróbuj online!
W przypadku, gdy wszystkie elementy są unikalne, zwraca to
0
(niezdefiniowane zachowanie).źródło