Leere Gläser Wasser werden in der folgenden Reihenfolge angeordnet:
Wenn Sie Flüssigkeit in das erste Glas einfüllen, wenn es voll ist, wird die zusätzliche Flüssigkeit in gleichen Mengen in die Gläser 2 und 3 eingefüllt. Wenn Glas 2 voll ist, wird die zusätzliche Flüssigkeit in 4 und 5 usw. geflogen.
Bei einem Flüssigkeitsgehalt von N Litern und einem maximalen Fassungsvermögen von 1 Liter pro Glas geben Sie die in einem Glas vorhandene Flüssigkeitsmenge an, wenn Sie N Liter Flüssigkeit durch Eingießen in das Glas leeren, indem Sie die Funktion ausfüllen, getWaterInBucket(int N, int X)
bei der X die Glaszahl ist. Wenn ich zum Beispiel am Anfang 4 Liter haben möchte und das Wasser in Glas 3 finden möchte, ist die FunktiongetWaterInBucket(4, 3)
Wie löse ich das programmatisch? Ich habe versucht, mit Pascals Dreieck eine mathematische Lösung zu finden. Das hat nicht funktioniert. Ich habe es als einen Baum betrachtet, also kann ich einen Parameter wie diesen hinzufügen getWaterInBucket(BTree root, int N, int X)
und dann eine rekursive Lösung für jede Ebene versuchen, aber Parameter sind in diesem Problem nicht zulässig. Gibt es einen offensichtlichen Trick?
quelle
Antworten:
Sie müssen nur das Gießen simulieren, so etwas wie
So wie es aussieht, ist dies kein Baum. Weil verschiedene Gläser in die gleichen Gläser fließen, wird verhindert, dass es sich um einen Baum handelt.
quelle
return glasses[N-1]
, denn die Glaszahlen beginnen bei 1 statt bei 0.So würde ich diese Frage in einer Interview-Situation beantworten (ich habe diese Frage vorher noch nicht gesehen und mir die anderen Antworten nicht angesehen, bis ich meine Lösung gefunden habe):
Zuerst habe ich versucht, es herauszufinden (was Sie die "mathematische Lösung" nannten), und als ich zu Glas 8 kam, wurde mir klar, dass es härter sein würde, als es schien, weil Glas 5 vor Glas 4 überzulaufen beginnt. An diesem Punkt begann ich beschlossen, den Rekursionsweg zu beschreiten (nur zu Ihrer Information, viele Fragen zu Programmierinterviews erfordern eine Rekursion oder Induktion, um sie zu lösen).
Beim rekursiven Denken wird das Problem viel einfacher: Wie viel Wasser ist in Glas 8? Die Hälfte der Menge, die aus den Gläsern 4 und 5 verschüttet wurde (bis sie voll ist). Das bedeutet natürlich, dass wir beantworten müssen, wie viel aus den Gläsern 4 und 5 verschüttet wurde, aber es stellt sich heraus, dass das auch nicht allzu schwer ist. Wie viel ist aus Glas 5 verschüttet worden? Die Hälfte davon wurde jedoch aus den Gläsern 2 und 3 verschüttet, abzüglich des in Glas 5 verbleibenden Liters.
Wenn Sie dies vollständig (und unordentlich) lösen, erhalten Sie:
An diesem Punkt (oder als ich dies schrieb) würde ich dem Interviewer sagen, dass dies nicht die ideale Lösung in der Produktion ist: Es gibt doppelten Code zwischen
howMuchSpilledOutOf()
undgetWaterInBucket()
; Es sollte einen zentralen Ort geben, an dem die Eimer ihren "Feedern" zugeordnet werden. In einem Interview, in dem Schnelligkeit und Genauigkeit der Implementierung wichtiger sind als Schnelligkeit der Ausführung und Wartbarkeit (sofern nicht anders angegeben), ist diese Lösung vorzuziehen. Dann würde ich anbieten, den Code umzugestalten, um näher an der Qualität zu sein, die ich für die Produktion halte, und den Interviewer entscheiden lassen.Letzte Anmerkung: Ich bin sicher, dass mein Code irgendwo einen Tippfehler enthält. Ich würde das auch dem Interviewer gegenüber erwähnen und sagen, dass ich mich sicherer fühlen würde, wenn ich es entweder überarbeitet oder auf Unit-Tests getestet hätte.
quelle
this isn't the ideal solution
.Wenn man dies als ein Baumproblem betrachtet, ist es ein roter Hering, es ist wirklich eine gerichtete Grafik. Aber vergiss das alles.
Denken Sie an ein Glas irgendwo unter dem oberen. Darüber befinden sich ein oder zwei Gläser, die überlaufen können. Mit der richtigen Wahl des Koordinatensystems (keine Sorge, siehe Ende) können wir eine Funktion schreiben, um die "Eltern" -Brille für jedes gegebene Glas zu erhalten.
Nun können wir uns einen Algorithmus überlegen, mit dem die in ein Glas gegossene Flüssigkeitsmenge unabhängig vom Überlauf aus diesem Glas ermittelt werden kann. Die Antwort ist jedoch, dass jedem Elternteil viel Flüssigkeit eingefüllt wird, abzüglich der Menge, die in jedem Elternglas gespeichert ist, geteilt durch 2. Summieren Sie dies einfach für alle Eltern. Schreiben Sie dies als Python-Fragment des Körpers einer amount_poured_into () -Funktion:
Mit max () soll sichergestellt werden, dass kein negativer Überlauf auftritt.
Wir sind fast fertig! Wir wählen ein Koordinatensystem mit 'y' auf der ganzen Seite, die erste Reihe ist 0, die zweite Reihe ist 1 usw. Die 'x'-Koordinaten haben eine Null unter der oberen Reihe und die zweite Reihe hat x-Koordinaten von -1 und +1, dritte Reihe -2, 0, +2 und so weiter. Der wichtige Punkt ist, dass das Glas ganz links oder ganz rechts in Stufe y abs (x) = y hat.
Wenn Sie das alles in Python (2.x) packen, haben wir:
Verwenden Sie also amount_in (total, p), um die tatsächliche Menge in einem Glas bei p zu erhalten.
Es ist nicht von der OP klar, aber das Bit über „Sie Parameter hinzufügen kippen“ bedeuten kann , die ursprüngliche Frage in Bezug auf dem Glas beantwortet werden muss Zahlen gezeigt. Dies wird gelöst, indem eine Zuordnungsfunktion von den Showglasnummern in das oben verwendete interne Koordinatensystem geschrieben wird. Es ist fummelig, aber es kann entweder eine iterative oder eine mathematische Lösung verwendet werden. Eine leicht verständliche iterative Funktion:
Schreiben Sie jetzt einfach die Funktion amount_in () um, um eine Glaszahl zu akzeptieren:
quelle
Interessant.
Dies erfolgt nach dem Simulationsansatz.
welche druckt (für 6 liter):
das scheint in etwa richtig zu sein.
quelle
Dies ist die Binomialfunktion. Das Verhältnis des Wassers zwischen den Gläsern der Stufe N kann mit nCr für jedes Glas in der Stufe ermittelt werden. Darüber hinaus ist die Gesamtzahl der Gläser vor der Stufe N die Summe von 1 bis (N - 1), eine Formel, für die Sie ziemlich leicht verfügbare finden sollten. Wenn X gegeben ist, sollten Sie in der Lage sein, den Füllstand zu bestimmen, und nCr verwenden, um die Verhältnisse der Gläser für diesen Füllstand zu überprüfen und so zu bestimmen, wie viel Wasser in X ist, wenn es genug Liter gibt, um trotzdem zu X zu gelangen.
Zweitens ist Ihre Idee, den BTree zu verwenden, in Ordnung. Der BTree ist lediglich eine interne Variable, kein externer Parameter.
IOW, wenn Sie diese Mathematik in Ihrer Ausbildung behandelt haben (hier in Großbritannien wird sie vor der Universität unterrichtet), sollten Sie in der Lage sein, dies ohne zu große Probleme zu lösen.
quelle