Was ist falsch mit dieser Lösung für die Max-Zähler codility Herausforderung
Also ich habe gehen durch die tests auf codility und etwas haben, hängt mit dem "Max-Zähler" (link https://codility.com/demo/take-sample-test/max_counters). Meine erste und naheliegende Lösung war die folgende:
def solution(N, A):
counters = N * [0];
for a in A:
if 1 <= a <= N:
counters[a - 1] += 1;
elif a == N + 1:
counters = N * [max(counters)];
return counters
das funktioniert ganz gut, aber zuviel Zeit in Anspruch nimmt, aufgrund der Tatsache, dass jeder Aufruf von max-Zähler füllt eine ganze Palette.
So kam ich auf die folgende Lösung scheint zu funktionieren ok für kleine Eingänge, aber zufällig falsche Ergebnisse liefert für mittlere und große Unternehmen.
def solution(N, A):
counters = N * [0];
current_max = 0;
last_update = 0;
for a in A:
if 1 <= a <= N:
counters[a - 1] += 1;
if counters[a - 1] < last_update:
counters[a - 1] = last_update + 1;
if counters[a - 1] > current_max:
current_max = counters[a - 1];
elif a == N + 1:
last_update = current_max;
for i in xrange(len(counters)):
if counters[i] < last_update:
counters[i] = last_update;
return counters
Ich kann nicht scheinen, um herauszufinden, was falsch mit es.
Edit: Ergebnis - http://codility.com/demo/results/demoQA7BVQ-NQT/
- Unbounded für dein problem, aber in python geben, die Sie nicht brauchen, semi collon.
- Das ist richtig. Noch nicht verwendet python in eine Weile.
- Was ist der Zweck der letzten Schleife ?
- Ich verstehe es nicht. Der einzige Weg, um den gleichen Wert für den Zähler ist A[K]=N+1 . Warum der Vergleich mit der last-update jedes element der counter ?
- Es ist zu vermeiden, aktualisieren Sie das gesamte array each-Schleife und statt dass man es nur einmal nach der Schleife, für diejenigen Schalter, die nicht vorhanden waren und die in das Eingabe-array. Wenn Sie
print A, current_max, last_update
each-Schleife werden Sie sehen, was Los ist. - E. g. Eingang (3, [3,3,4,3]) wird in (0,0,1) -> (0,0,2) -> (0,0,2) -> (0,0,3). Letzte loop wird es (2,2,3), das ist die korrekte Antwort.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ein problem ist hier:
was ist, wenn
counters[a - 1]
warlast_update - 1
?else
- Anweisung löst das problem.Überprüfen Sie dieses (python, bekommen 100 score):
Das Geheimnis ist, nicht auf " alle aktualisieren der Zähler jedes mal, wenn Sie die Anweisung zu stoßen, Sie alle bis auf einen neuen Minimalwert. Dies erfordert eine operation mit jeder Zähler bei jeder Gelegenheit, und das ist der Unterschied zwischen einem ~60% Punktzahl und eine 100% - score.
Stattdessen vermeiden diese Treffer durch verfolgen der aktuellen minimum-und maximum-Werte; verwenden und aktualisieren Sie für jeden Zähler die Sie besuchen.
Dann, nach all den Anweisungen verarbeitet werden, weil es vielleicht Schalter, die noch nicht berührt worden ist, mit Ihren eigenen persönlichen update seit dem letzten update-alle Anweisungen, pass über den Tresen selbst und gewährleisten, dass Sie mindestens Wert.
http://codility.com/demo/results/demoF3AMPT-FVN/
Können Sie einen Blick auf meine Lösung(in C# geschrieben aber):
Betrachten Sie diese 100/100-Lösung in Ruby:
Javascript 100/100
Meine python version nur 66 Punkte erzielt, da es ein wenig zu langsam für die späteren tests.
100/100 Lösung in C
Habe ich 77% mit dieser Lösung in java:
Kann mir jemand empfehlen die 100% Lösung ?
MaxCounters Lösung in C
Javascript 100/100
JS:
Dies ist eine modifizierte version von @jacoor Lösung mit etwas mehr idiomatic python und Namen von Variablen und if-Anweisung Bedingungen genauer widerspiegelt, die Beschreibung des Problems.
https://codility.com/demo/results/demo6KPS7K-87N/
C++ 100/100
Der Schlüssel ist, zu IGNORIEREN, die Probe iteration in das problem, es wird Sie führen zu einem O(m*n) Zeitkomplexität-Lösung.
}
C# - a 100/100 Lösung