Sie sind ein junger Programmierer, der mit Ihren beiden besten Freunden zusammenlebt. Jede Woche muss einer von euch alle Aufgaben des Hauses erledigen und ihr entscheidet, wer an der Reihe ist, indem ihr einen Stock auswählt. Derjenige, der den kürzesten Stock auswählt, verliert und erledigt alle Aufgaben.
Da Sie alle Programmierer sind und gerne Rätsel erstellen, haben Sie den "Pick the Shortest Stick" in ein Computerpuzzle verwandelt.
Hier sind die Regeln des Puzzles.
- Sie erhalten eine 2D-Matrix, in der jede Spalte einen Stab darstellt.
- In jeder Spalte steht 1 für einen Teil des Sticks und 0 für ein Leerzeichen
- Wenn von oben nach unten in jeder Spalte gehen, zunächst haben Sie
0
‚s und sobald Sie einen Hit1
, hat der Stick gestartet und den Rest der Säule wird mit gefüllt wird1
nur - Sie können Ihr Programm schreiben, um eine Spalte auszuwählen. Die Größe des Schlägers in dieser Spalte bestimmt den Gewinner / Verlierer. Stickgröße == Anzahl der Einsen in dieser Spalte.
- Dieses Programm kann jedoch nur eine lineare Zeitkomplexität im ungünstigsten Fall aufweisen.
Da Sie alle Programmierer sind, wissen Sie, ob das Programm eines anderen die zeitliche Komplexitätsgrenze überschreitet.
Ihre Aufgabe ist es:
- Schreiben Sie ein Programm oder eine Funktion, die Eingaben in einem 2D-Format oder einem Array von Zeichenfolgen akzeptiert.
- Die Eingabe kann über STDIN / prompt / console oder ein Funktionsargument erfolgen.
- Wenn Sie die Eingabe von STDIN / prompt lesen, können Sie davon ausgehen, dass das Lesen der Eingabe und das Konvertieren in ein Array 0-mal dauert (obwohl der Code dafür in Ihrer Antwort vorhanden sein muss).
- Bestimmen Sie die Säule mit dem längsten Stock.
- Die Ausgabe kann der Rückgabewert der Funktion oder STDOUT / console / alert sein.
- Das Programm / die Funktion muss eine lineare Zeitkomplexität im ungünstigsten Fall haben,
O(m+n)
wobeim
die Anzahl der Zeilen undn
die Anzahl der Spalten ist.
Die Eingabe kann in einem der folgenden Formate erfolgen:
2D-Array:
[ [0, 0, 0, 0],
[1, 0, 0, 0],
[1, 1, 0, 1],
[1, 1, 1, 1] ]
Reihe von Zeichenfolgen:
[ "0000", "1000", "1101", "1111" ]
Die Eingabe hat folgende Eigenschaften:
- Die Größe des Arrays ist unbekannt. Nehmen Sie ein Rechteck beliebiger Größe an
- Wenn Sie in einer Spalte von oben nach unten eine 1 sehen, ist alles unten eine Eins
- Leere Spalten (dh 0-Länge) Stöcke sind erlaubt.
Dies ist ein Code-Golf, also gewinnt der kürzeste Code ! *
Bitte erläutern Sie Ihren Code oder geben Sie die unbenutzte Version (um die zeitliche Komplexität zu überprüfen) zusammen mit dem von Ihnen erwarteten Eingabeformat an.
UPDATE Die lineare Zeitkomplexität bedeutet hier O (n + m), wobei n die Spaltengröße und m die Zeilengröße ist. (Für diejenigen, die unklar waren)
UPDATE 2 Dies kann definitiv in linearer Zeit erfolgen. Und wenn Sie eine Antwort veröffentlichen, können Sie die Veröffentlichung der Logik / des Algorithmus für einen fairen Kampf um ein paar Tage verschieben :)
UPDATE 3 Ich werde in ein paar Stunden alle Antworten durchgehen, um die Zeitkomplexität und das Programm zu überprüfen :)
1
in der Eingabe die allerletzte Zelle Es ist notwendig, die gesamte Eingabe zu lesen. Selbst wenn die Standardbibliothek einer Sprache einen zufälligen Zugriff auf stdin fälscht, puffert sie diese unter den Szenen und die dafür benötigte Zeit ist Omega (n * m).