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!
e
(z. B. Python, wobei Python e=2.71828
kürzer ist als import math;math.E
)
e
soll verwendet werden?