Das Sekretärsproblem ist ein berühmtes Problem, das folgendermaßen beschrieben wird:
- Du brauchst eine neue Sekretärin
- Sie haben N Bewerber, die Sie einzeln befragen können
- Sie können jeden Bewerber nach dem Vorstellungsgespräch bewerten. Ihr Punktesystem gibt niemals zwei Bewerbern die gleiche Punktzahl
- Nachdem Sie einen Bewerber interviewt haben, müssen Sie sofort "Ja" oder "Nein" sagen
- Sie möchten den Bewerber mit der höchsten Punktzahl
Die Lösung besteht darin, die ersten floor(N/e)
Bewerber zu befragen und dann den ersten Bewerber zu akzeptieren, der eine höhere Punktzahl als alle vorherigen Bewerber aufweist. Wenn keiner der Bewerber höher ist, senden Sie den letzten Bewerber zurück. Interessanterweise hat der Top-Bewerber 1/e
in dieser Zeit einen prozentualen Anteil. e
bezieht sich auf Eulers Nummer . Um den Wert von zu erhalten e
, können Sie einen eingebauten Wert verwenden log
oder ihn mit mindestens 5 Dezimalstellen fest codieren .
Eingang:
Ein nicht leeres Array von eindeutigen nicht negativen ganzen Zahlen, nicht mehr als 2^31-1
.
Ausgabe:
Eine Ganzzahl, die den ausgewählten Kandidaten darstellt. Um klar zu sein, ist der Algorithmus:
- Finden Sie das maximale Element in den ersten
floor(N/e)
Elementen des Arrays. - Durchlaufen Sie die verbleibenden Elemente und geben Sie das erste Element zurück, das höher als das in Schritt 1 festgelegte Maximum ist.
- Wenn keines der Elemente höher ist, geben Sie das letzte Element zurück.
Angenommen, Ihr Array war [2,7,4,3,9,20]
, so N = 6
und floor(N/e) = 2
. Die ersten beiden Elemente des Arrays sind [2,7]
. Das Maximum von [2,7]
ist 7
. Die restlichen Elemente sind [4,3,9,20]
. Das erste Element , das größer ist als 7
ist 9
, so geht es zurück 9
.
Testfälle:
[0] => 0
[100] => 100
[100, 45] => 100
[0, 1] => 0
[45, 100] => 45
[1, 4, 5] => 4
[1, 5, 4] => 5
[5, 4, 1] => 1
[5, 1, 4] => 4
[4, 1, 5] => 5
[56, 7, 37, 73, 90, 59, 65, 61, 29, 16, 47, 77, 60, 8, 1, 76, 36, 68, 34, 17, 23, 26, 12, 82, 52, 88, 45, 89, 94, 81, 3, 24, 43, 55, 38, 33, 15, 92, 79, 87, 14, 75, 41, 98, 31, 58, 53, 72, 39, 30, 2, 0, 49, 99, 28, 50, 80, 91, 83, 27, 64, 71, 93, 95, 11, 21, 6, 66, 51, 85, 48, 62, 22, 74, 69, 63, 86, 57, 97, 32, 84, 4, 18, 46, 20, 42, 25, 35, 9, 10, 19, 40, 54, 67, 70, 5, 44, 13, 78, 96]
=> 98
[10, 68, 52, 48, 81, 39, 85, 54, 3, 21, 31, 59, 28, 64, 42, 90, 79, 12, 63, 41, 58, 57, 13, 43, 74, 76, 94, 51, 99, 67, 49, 14, 6, 96, 18, 17, 32, 73, 56, 7, 16, 60, 61, 26, 86, 72, 20, 62, 4, 83, 15, 55, 70, 29, 23, 35, 77, 98, 92, 22, 38, 5, 50, 82, 1, 84, 93, 97, 65, 37, 45, 71, 25, 11, 19, 75, 78, 44, 46, 2, 53, 36, 0, 47, 88, 24, 80, 66, 87, 40, 69, 27, 9, 8, 91, 89, 34, 33, 95, 30]
=> 30
Ihre Lösung muss sein O(n)
, wo n
ist die Länge des Arrays. Wenn Ihre Sprache über eine integrierte Funktion verfügt, die das Maximum eines Arrays ermittelt, können Sie davon ausgehen, dass die Funktion dauertO(n)
(und hoffentlich auch) dauert.
Es gelten Standardlücken, und dies ist ein Code-Golf , also machen Sie die kürzeste Antwort in Ihrer Lieblingssprache!
quelle
e
soll verwendet werden?e
(z. B. Python, wobei Pythone=2.71828
kürzer ist alsimport math;math.E
)Antworten:
Gelee, 13 Bytes
Auf jeden Fall ein O (n) -Algorithmus, hoffentlich eine O (n) -Implementierung. Probieren Sie es online!
Wie es funktioniert
quelle
CJam, 20 Bytes
Funktioniert ähnlich wie Dennis 'Vorschlag.
quelle
$W=
läuft nicht in linearer Zeit.:e>
(um Maximum reduzieren)Java,
128118 BytesEingerückt:
quelle
MATL ,
272523 BytesVerwendet den gleichen Ansatz wie A. Simmons 'CJam-Antwort .
Probieren Sie es online!
quelle
JavaScript (ES6) 64
Weniger golfen
Prüfung
quelle
Ruby, 64 Bytes
quelle
a.find
im zweiten Schritt tun , obwohl es offensichtlich viel weniger effizient ist.(0...c)
für einen Bereich verwenden, der c ausschließt.PARI / GP , 70 Bytes
Dies kann bei älteren Versionen von gp Probleme bereiten, wenn ein Singleton angegeben wird, funktioniert jedoch mindestens ab Revision 18487.
quelle
JavaScript (ES6), 79 Byte
Funktioniert , weil
findIndex
kehrt-1
bei einem Fehler, abera.slice(-1)[0]
kehrt das letzte Element der Anordnung , wie gewünscht.quelle
Python 2, 87 Bytes
Der Benutzer gibt das Array als Liste mit eckigen Klammern und Kommas ein. Der
input()
Befehl von Python 2 ist hier praktisch.Unabhängig davon, ob wir den Prozess vorzeitig beenden oder nicht, stellen wir die letzte Person ein, die interviewt wurde.
quelle
Perl 6, 43 Bytes
Ich denke das ist O (n)
quelle
Python 3.5; 110 Bytes:
Grundsätzlich bedeutet das oben Gesagte, dass zuerst ein bereitgestelltes Array benötigt wird, "h" , solange es mehr als 5 Elemente enthält (vorerst ...), und der Maximalwert im ersten (Länge des Arrays (len (h )) / Eulers Zahl (bis zu 5 Dezimalstellen)) dieses Arrays und gibt diesen Wert als "k" zurück. Außerdem ist "n" der Maximalwert im Rest des Arrays. Schließlich ist der von der Funktion zurückgegebene Wert der Maximalwert in einem Array, das sowohl "k" als auch "n" enthält.
Hinweis: Die
max()
Funktion von Python ist die Komplexität von O (n).Unten finden Sie eine besser lesbare Nicht-Code-Golf- Version des obigen Codes, die ein zufälliges, eindeutiges Array mit 10 Elementen enthält, um zu bestätigen, dass es funktioniert:
quelle