Suchen Sie bei einem Array a, das nur Zahlen im Bereich von 1 bis a.length enthält, die erste doppelte Zahl, für die das zweite Vorkommen den minimalen Index hat. Mit anderen Worten, wenn es mehr als eine doppelte Zahl gibt, geben Sie die Zahl zurück, für die das zweite Vorkommen einen kleineren Index hat als das zweite Vorkommen der anderen Zahl. Wenn es keine solchen Elemente gibt, kann Ihr Programm / Ihre Funktion zu undefiniertem Verhalten führen.
Beispiel:
Für a = [2, 3, 3, 1, 5, 2]
sollte die Ausgabe sein
firstDuplicate(a) = 3
.
Es gibt 2 Duplikate: Nummer 2 und 3. Das zweite Vorkommen von 3 hat einen kleineren Index als das zweite Vorkommen von 2, daher lautet die Antwort 3.
Für a = [2, 4, 3, 5, 1]
sollte die Ausgabe sein
firstDuplicate(a) = -1
.
Das ist Code-Golf , also gewinnt die kürzeste Antwort in Bytes.
BONUS: Können Sie es in O (n) Zeitkomplexität und O (1) zusätzlicher Raumkomplexität lösen?
quelle
Antworten:
Python 2 , 34 Bytes
O (n 2 ) Zeit, O (n) Raum
3 Bytes gespart dank @vaultah und 3 weitere von @xnor!
Probieren Sie es online!
quelle
lambda l:l[map(l.remove,set(l))<0]
Arbeiten, obwohl die Reihenfolge der Auswertung seltsam ist.-1
wenn keine Duplikate ohne den 'Fußzeilencode' gefunden werden. Zählt dieser Code nicht zu den Bytes? Ich bin neu im Codieren von Golf, tut mir leid, wenn es eine grundlegende Frage ist!JavaScript (ES6),
47363125 Byte6 Bytes gespart dank ThePirateBay
Gibt zurück,
undefined
wenn keine Lösung vorhanden ist.Zeitkomplexität: O (n) :-)
Raumkomplexität: O (n) :-(
Wie?
Wir verfolgen bereits festgestellte Werte, indem wir sie unter Verwendung negativer Zahlen als neue Eigenschaften des ursprünglichen Arrays a speichern . Auf diese Weise können sie möglicherweise nicht die ursprünglichen Einträge stören.
Demo
Code-Snippet anzeigen
quelle
a=>a.find(c=>!(a[-c]^=1))
Mathematica, 24 Bytes
Mathematics Pattern Matching-Fähigkeit ist so cool!
Gibt das Original
List
für ungültige Eingaben zurück.Erläuterung
Ersetzen Sie in der Eingabe ...
A
List
mit einem doppelten Element, mit 0 oder mehr Elementen vor, zwischen und nach den doppelten Elementen ...Mit dem doppelten Element.
quelle
Gelee , 5 Bytes
Probieren Sie es online!
Wie es funktioniert
quelle
œ-
Entfernt das am weitesten rechts stehende Vorkommen? TIL-1
für keine Duplikate zurückzukehren. Das Auslösen einer Ausnahme ist gemäß OP in Ordnung, aber ich bin nicht sicher, ob dies der Fall0
ist, obwohl es nicht im Bereich liegt.Haskell , 35 Bytes
Probieren Sie es online! Stürzt ab, wenn kein Duplikat gefunden wird.
quelle
Gelee , 6 Bytes
Probieren Sie es online!
Gibt das erste Duplikat zurück oder 0, wenn es kein Duplikat gibt.
Erläuterung
quelle
ŒQi0ị
.i0
0ị
zurückgegeben. Dabei wird der letzte Wert der Eingabe anstelle von 0 indiziert und zurückgegeben.Japt , 7 Bytes
Online testen!
Erläuterung
Alternative:
Online testen!
Erläuterung
quelle
Pyth, 5 Bytes
Testsuite
Entfernen Sie aus Q das erste Erscheinungsbild jedes Elements in Q und geben Sie dann das erste Element zurück.
quelle
Dyalog APL,
27242019131211 BytesJetzt geändert, um nicht von v16 abzuhängen! Probieren Sie es online!
Wie? (Mit Eingang N )
⊢⊃⍨...
- N bei diesem Index:⍴↑∪
- N mit entfernten Duplikaten, rechts gepolstert, um0
zu passen N⊢=
- Elementweise Gleichheit mit N0⍳⍨
- Index der ersten0
. `quelle
⎕AV
, oder?⎕U2378
beim Laden. Probieren Sie es online!Python 3 ,
9492 BytesO (n) Zeit und O (1) zusätzlicher Speicher.
Probieren Sie es online!
Quelle des Algorithmus .
Erläuterung
Die Grundidee des Algorithmus besteht darin, jedes Element von links nach rechts zu durchlaufen, die aufgetretenen Zahlen zu verfolgen und die Zahl bei Erreichen einer bereits aufgetretenen Zahl zurückzugeben und nach dem Durchlaufen jedes Elements -1 zurückzugeben.
Es verwendet jedoch eine clevere Methode, um die angezeigten Zahlen zu speichern, ohne zusätzlichen Speicherplatz zu belegen: Sie werden als Vorzeichen des durch die Zahl indizierten Elements gespeichert. Zum Beispiel kann ich die Tatsache darstellen, dass
2
und3
bereits mita[2]
unda[3]
negativ erschienen ist, wenn das Array 1-indiziert ist.quelle
i
wo a [i]> n tun ?1
zu a.length, aber für a [i] = a.length würde dies nicht über die Grenzen hinausgehen?t=abs(a[i])-1=a.length-1
Perl 6 , 13 Bytes
Versuch es
Erläuterung
Das
*
ist in einer Zeitposition , so dass die ganze Aussage a WhateverCode Lambda.Dies
.repeated
ist eine Methode, die zu jedem Wert führt, mit Ausnahme des ersten Males, bei dem jeder Wert angezeigt wurde.[0]
Liefert nur den ersten Wert in der Seq .Wenn es keinen Wert gibt, wird Nil zurückgegeben.
( Nil ist die Basis der Ausfallarten und alle Arten sind , ihre eigenen nicht definierten Wert, so Nil anders als einen nicht definierten Wert in den meisten anderen Sprachen)
Beachten Sie, dass seit der Implementierung von
.repeated
ein Seq generiert wird , das bedeutet, dass keine Arbeit anfängt, bis Sie nach einem Wert fragen, und nur genug Arbeit geleistet wird, um das zu generieren, wonach Sie fragen.Es ist also leicht zu argumentieren, dass dies im schlimmsten Fall eine Komplexität von O (n) und im besten Fall eine Komplexität von O (2) aufweist, wenn der zweite Wert eine Wiederholung des ersten Werts ist.
Ähnliches gilt wahrscheinlich für die Speicherkomplexität.
quelle
APL (Dyalog) , 20 Bytes
Probieren Sie es online!
2⍴¯1
negative r eshaped in eine längen zwei Listen⎕,
get input (mnemonic: console box) und davor stellenn←
Speichern Sie das in n,\
Präfixe von n (lit. kumulative Verkettung)(
…)¨
Wenden Sie auf jedes Präfix die folgende implizite Funktion an,
[is] the ravel (stellt nur sicher, dass das Präfix eine Liste ist)≢
anders als∪
die eindeutigen Elemente [?] (dh hat das Präfix Duplikate?)n/⍨
benutze das, um n zu filtern (entfernt alle Elemente bis zu dem ersten, für das ein Duplikat gefunden wurde)⊃
wähle das erste Element ausquelle
APL (Dyalog) , 11 Bytes
Nach den neuen Regeln wird ein Fehler ausgegeben, wenn keine Duplikate vorhanden sind.
Probieren Sie es online!
⍳⍨
die Indizes des ersten Auftretens jedes Elements~
entfernt von⍳∘≢
aller Indizes⍬⍴
verwandle das in einen Skalar (ergibt Null, wenn keine Daten verfügbar sind)⊃⍨
wähle damit aus (gibt Fehler auf Null)⊢
das Argumentquelle
APL, 15
Scheint, als könnten wir 0 statt -1 zurückgeben, wenn es keine Duplikate gibt (danke Adám für den Kommentar). Also 3 Bytes weniger.
Ein bisschen Beschreibung:
Als Referenz fügte die alte Lösung -1 zur Liste am Ende hinzu. Wenn die Liste leer wäre, würde sie stattdessen -1 enthalten und das erste Element wäre -1.
Probieren Sie es auf tryapl.org
quelle
¯1
, so{⊃⍵[(⍳⍴⍵)~⍵⍳⍵]}
tun sollten.Retina ,
2624 BytesProbieren Sie es online! Erläuterung:
\b(\d+)\b
Stimmt nacheinander mit jeder Zahl überein, und dann prüft der Lookbehind, ob es sich bei der Zahl um ein Duplikat handelt. Wenn dies der1
Fall ist!
, wird die erste Übereinstimmung ausgegeben und nicht die Anzahl der Übereinstimmungen. Leider scheint es nicht zu funktionieren, das Lookbehind an die erste Stelle zu setzen, da es sonst mehrere Bytes einspart. Bearbeiten:7 Bytes hinzugefügt, um dem2 Bytes dank @MartinEnder gespart.-1
Rückgabewert bei keiner Übereinstimmung zu entsprechen.quelle
-1
.MATL , 8 Bytes
Gibt einen Fehler (ohne Ausgabe) aus, wenn kein Duplikat vorhanden ist.
Probieren Sie es bei MATL Online!
Erläuterung
quelle
R, 34 Bytes
Schneiden Sie ein paar Zeichen von der Antwort von @djhurio ab, haben Sie aber nicht genug Ruf, um einen Kommentar abzugeben.
quelle
-1
aber mit der neuen Spezifikation konnte ich noch mehr Golf spielen. Dies ist immer noch solide und es ist ein anderer Ansatz als er, also gebe ich dir +1!J,
1716 BytesWie?
quelle
R , 28 Bytes
Probieren Sie es online!
quelle
NA
nach fehlenden Werten zurückkehren, da sich die Spezifikation geändert hat. so(x=scan())[duplicated(x)][1]
ist vollkommen gültig.J , 12 Bytes
Probieren Sie es online!
Erläuterung
quelle
Dyalog APL Classic, 18 Zeichen
Funktioniert nur in
⎕IO←0
.Entfernen Sie aus der Liste der Indizes der Elemente des Arguments mit einem vorangestellten "-1" die Listenindizes seines Nubs und wählen Sie dann den ersten der verbleibenden Indizes aus. Wenn nach dem Entfernen nur ein leerer Vektor übrig bleibt, ist sein erstes Element per Definition 0, das verwendet wird, um das erweiterte Argument zu indizieren, das das gewünschte -1 ergibt.
quelle
¯1
, damit Sie ihn entfernen¯1,
und verwenden können⎕IO←1
.Rubin ,
2836 BytesIch habe die Herausforderung das erste Mal missverstanden.
O(n)
Zeit,O(n)
Raum.Probieren Sie es online!
quelle
Java (OpenJDK 8) ,
65117109 BytesBisherige 65-Byte-Lösung:
Neue Lösung. Für sind 19 Bytes enthalten
import java.math.*;
-8 Bytes dank @Nevay
Probieren Sie es online!
Bearbeiten
Der Algorithmus in meinem ursprünglichen Programm war in Ordnung, aber die statische Größe des verwendeten Datentyps bedeutete, dass er ziemlich schnell kaputt ging, sobald die Größe einen bestimmten Schwellenwert überschritt.
Ich habe den in der Berechnung verwendeten Datentyp geändert, um das Speicherlimit des Programms zu erhöhen, um dies zu berücksichtigen (mit
BigInteger
willkürlicher Genauigkeit anstelle vonint
oderlong
). Dies macht es jedoch fraglich, ob dies gilt oder nichtO(1)
Raumkomplexität .Ich werde meine Erklärung im Folgenden intakt lassen, aber ich möchte hinzufügen, dass ich jetzt glaube, dass es unmöglich ist, dies zu erreichen
O(1)
Raumkomplexität , ohne einige Annahmen zu .Beweis
Definieren Sie
N
als Ganzzahl, so dass2 <= N
.Sei
S
eine Liste, die eine Reihe zufälliger Ganzzahlen darstellt[x{1}, ..., x{N}]
, fürx{i}
die die Einschränkung gilt1 <= x{i} <= N
.Die Zeitkomplexität (in Big-O-Notation), die erforderlich ist, um diese Liste genau einmal pro Element zu durchlaufen, beträgt
O(n)
Die Herausforderung besteht darin, den ersten doppelten Wert in der Liste zu finden. Insbesondere suchen wir nach dem ersten Wert
S
, der ein Duplikat eines vorherigen Elements in der Liste ist.Lassen Sie
p
undq
die Positionen von zwei Elementen in der Liste sein, so dassp < q
undx{p} == x{q}
. Unsere Herausforderung besteht darin, die kleinste zu findenq
, die diese Bedingungen erfüllt.Der offensichtliche Ansatz für dieses Problem besteht darin, S zu durchlaufen und zu prüfen, ob unsere
x{i}
in einer anderen Liste vorhanden istT
: Wennx{i}
sie nicht in vorhanden istT
, speichern wir sie inT
. Wennx{i}
in vorhanden istT
, ist dies der erste doppelte Wert und daher der kleinsteq
, und wir geben ihn als solchen zurück. Diese Raumeffizienz istO(n)
.Um
O(1)
Raumkomplexität bei gleichzeitiger Aufrechterhaltung derO(n)
Zeitkomplexität zu erreichen, müssen wir eindeutige Informationen zu jedem Objekt in der Liste auf einer begrenzten Fläche speichern. Aus diesem Grund ist dies die einzige Möglichkeit, mit der ein Algorithmus ausgeführt werden kannO(1)
Die Raumkomplexität ist, wenn: 1. N eine Obergrenze gegeben wird, die dem Speicher entspricht, der zum Speichern der maximalen Anzahl möglicher Werte für einen bestimmten endlichen Datentyp erforderlich ist. 2. Die Neuzuweisung einer einzelnen unveränderlichen Variablen wird nicht auf die Komplexität angerechnet, sondern nur auf die Anzahl der Variablen (eine Liste mit mehreren Variablen). 3. (Basierend auf anderen Antworten) Die Liste ist (oder zumindest die Elemente der Liste sind) veränderbar, und der Datentyp der Liste ist als vorzeichenbehaftete Ganzzahl voreingestellt, sodass Änderungen an Elementen in der Liste vorgenommen werden können ohne zusätzlichen Speicher zu verwenden.1 und 3 erfordern Annahmen und Spezifikationen zum Datentyp, während 2 erfordert, dass nur die Anzahl der Variablen für die Berechnung der Raumkomplexität berücksichtigt wird und nicht die Größe dieser Variablen. Wenn keine dieser Annahmen akzeptiert wird, ist es unmöglich, sowohl
O(n)
Zeitkomplexität als auchO(1)
Raumkomplexität zu erreichen.Erläuterung
Was für ein Junge, dieser brauchte
eine peinlich lange Zeit, um sichein bisschen Gehirnleistungauszudenken.Es ist also schwierig, den Bonus zu bekommen. Wir müssen beide die gesamte Liste genau einmal durcharbeiten und verfolgen, welche Werte wir bereits durchlaufen haben, ohne dass zusätzliche Platzkomplexität erforderlich ist .
Bit-Manipulation löst diese Probleme. Wir initialisieren unseren
O(1)
'Speicher', ein Paar Ganzzahlen, durchlaufen dann die Liste, indem wir das i-te Bit in unserer ersten Ganzzahl ODER-ODER-verknüpfen und dieses Ergebnis in der zweiten speichern.Wenn wir zum Beispiel haben
1101
und eine ODER-Operation mit ausführen10
, erhalten wir1111
. Wenn wir einen anderen OP machen10
, haben wir noch1101
.Ergo, sobald wir die OP-Operation ausgeführt haben und dieselbe Nummer haben, haben wir unser Duplikat gefunden. Keine Duplikate im Array führen dazu, dass das Programm überläuft und eine Ausnahme auslöst.
quelle
PHP,
56 44 3832 BytesLaufen Sie wie folgt:
Erläuterung
Optimierungen
Komplexität
Wie aus der kommentierten Version des Codes hervorgeht, ist die zeitliche Komplexität linear
O(n)
. In Bezug auf den Speicher werden maximaln+1
Variablen zugewiesen. Das ist es alsoO(n)
.quelle
error_reporting
Option zur Bytezahl hinzufügen (oder verwenden-n
, was kostenlos ist)./dev/null
, was dasselbe ist.O(1)
für zusätzlichen Platz? Sien
O(n)
Java 8,
827876 BytesNicht mehr verfügbar,756764 Bytes unten in BearbeitungAls Lambda-Funktion:
Wahrscheinlich kann man das viel kleiner machen, das ging sehr schnell.
Erläuterung:
*Bearbeiten*
756764 Bytes unter Verwendung der Negationsstrategie:Probieren Sie es online!
(-3 Bytes dank @Nevay)
Erläuterung:
Schleifen über das Array, negieren, um den Überblick zu behalten. Wenn keine Dummköpfe, läuft nur über und wirft einen Fehler.
Beide Arbeiten beschäftigen sich mit der Komplexität von O (n) Zeit und O (n) Raum.
quelle
Number
, dai
along
und a-1
istint
.long
, aber nicht auf,Long
wie es für die Zuordnung des Lambda zu a erforderlich ist, umgewandeltFunction
. Hast du es getestet? Unabhängig davon kann diese Lösung durch Ihre neue ersetzt werden.Set s=new HashSet();
, um 7 Bytes zu sparen. (Außerdem: afaik muss der Import vonjava.util.*;
in die Byteanzahl einbezogen werden -> +19 Bytes.) Die return-Anweisung kann seinreturn++j
, die if-Anweisung kann entfernt werdena->{int i=0,j;for(;(a[j=Math.abs(a[i++])-1]*=-1)<0;);return++j;}
(-3 Bytes).Brachylog , 5 Bytes
Probieren Sie es online!
Erläuterung
Das integrierte Adfix
a
listet zuerst alle Präfixe in aufsteigender Reihenfolge der Länge und dann die Suffixe in absteigender Reihenfolge der Länge auf. Daher wird die Ausgabe mit dem kürzesten Präfix erzeugt, das es zulässt, falls vorhanden. Wenn ein Präfix keine Duplikate enthält, schlägt der Rest des Programms fehl, da jede Teilsequenz gleicher Elemente die Länge 1 hat und das erste Element seines Endes nicht existiert. Wenn ein Präfix ein wiederholtes Element enthält, können wir die Teilsequenz der Länge 2 auswählen, die beide Elemente enthält, und das Programm gibt letztere zurück.quelle
a⊇Ċ=h
werden nur Teilmengen der Länge 2 betrachtet.145 Bytes
Wahrscheinlich viel kürzer, um dies in C # mit einer einfachen Schleife zu tun, aber ich wollte es mit Linq versuchen.
Probieren Sie es online!
Voll / Formatierte Version:
quelle
Haskell ,
78-69BytesProbieren Sie es online!
9 Bytes dank @nimi gespeichert
Ein grundlegender Pfad durch die Liste. Wenn das aktuelle Element noch nicht gesehen wurde (
i<0
) und sich in der Akkuliste befindet (elem x a
), speichern Sie den aktuellen Index. Ansonsten behalten Sie den Index -1. Fügen Sie in jedem Fall das aktuelle Element zur Akkuliste hinzu.EDIT : Ich habe die Frage nicht sorgfältig genug gelesen: Dieser Code gibt den Index des zweiten Elements eines doppelten Elements aus.
quelle
\ ... ->(last$i:[j|i<0,elem x a],x:a)
. Außerdem: keine Notwendigkeit für dief=
, weil unbenannte Funktionen erlaubt sind.Python 2,
7165 BytesGibt zurück,
None
wenn kein doppeltes Element vorhanden istEdit: -6 Bytes dank @ musicman523
Probieren Sie es online!
O (n) Zeitkomplexität, O (n) Raumkomplexität, O (1) Hilfsraum.
Da die Eingabeliste den O (n) -Raum verwendet, ist die Raumkomplexität hieran gebunden. Das heißt, wir können keine niedrigere Raumkomplexität als O (n) haben
Ändert die ursprüngliche Liste, wenn dies nicht erlaubt ist, könnten wir es in der gleichen Komplexität mit 129 Bytes tun
Erläuterung
Da jedes Element größer als 0 und kleiner oder gleich der Größe der Liste ist, enthält die Liste für jedes Element a ein Element auf Index a - 1 (0 indiziert). Wir nutzen dies aus, indem wir sagen, wenn das Element bei Index i negativ ist, haben wir es bereits gesehen.
Für jedes Element a in der Liste n sei u der absolute Wert von a negativ. (Wir lassen es negativ sein, da Python Listen mit negativen Indizes indizieren kann und dies andernfalls tun müsste.
u=abs(a)-1
) Wenn das Element am Index u in der Liste negativ ist, haben wir es bereits gesehen und können daher -u zurückgeben (um das zu erhalten) absoluter Wert von a, da alle Elemente positiv sind) . Anderenfalls setzen wir das Element am Index u auf negativ, um uns daran zu erinnern, dass wir bereits ein Element mit dem Wert a gesehen haben.quelle
1
und enthalten kannn
, wie es angegeben wurde, funktioniert es offensichtlich nicht.Gelee , 4 Bytes
Probieren Sie es online!
Falls alle Elemente eindeutig sind, wird dies zurückgegeben
0
(undefiniertes Verhalten).quelle