Schreiben Sie ein Programm, um alle möglichen Werte des Datentyps int vom kleinsten zum größten mit Java auszugeben.
Einige bemerkenswerte Lösungen vom 8. Mai 2009, 10:44 GMT:
1) Daniel Lew war der Erste, der richtig funktionierender Code .
2) Kris hat die einfachste Lösung für das gegebene Problem.
3) Tom Hawtin - Tackline, kam wohl mit die eleganteste Lösung .
4) mmyers wies darauf hin, dass der Druck wahrscheinlich zu einem Engpass werden würde und kann durch Pufferung verbessert werden .
5) Jay's Brute-Force-Ansatz ist bemerkenswert, da der resultierende Quellcode nicht nur dem Kernpunkt der Programmierung trotzt, sondern auch etwa 128 GB benötigt und Compiler-Grenzen sprengen wird.
Als Nebenbemerkung glaube ich, dass die Antworten zeigen, dass es sich um eine gute Interviewfrage handeln könnte, solange nicht die Fähigkeit besteht, sich an Wissen über den Datentypenüberlauf und dessen Auswirkungen zu erinnern während des Komponententests), oder die Art und Weise, MAX- und MIN-Limits zu erhalten (kann leicht in der Dokumentation nachgeschlagen werden), sondern eher die Analyse verschiedener Arten des Umgangs mit dem Problem.
Einfachstes Formular (Mindestcode):
%Vor%Kein Integer-Überlauf, keine zusätzlichen Überprüfungen (nur ein wenig mehr Speicherverbrauch, aber keine 32 Ersatz-Bits liegen herum).
Obwohl ich annehme
%Vor%hat weniger Zeichen, ich kann nicht wirklich sagen, dass es einfacher ist . Kürzere ist nicht unbedingt einfacher, es hat jedoch weniger Code.
Ich muss nur eine Antwort hinzufügen ...
%Vor%Gibt es etwas Schwieriges, das ich nicht erwische? Dort ist wahrscheinlich ... ( edit: ja, gibt es!)
%Vor%Da der Druck der Flaschenhals ist, würde ein Puffer die Geschwindigkeit ziemlich verbessern (ich weiß, weil ich es gerade ausprobiert habe):
%Vor%Außerdem wird diese Version tatsächlich enden (danke an Daniel Lew für den Hinweis, dass es tatsächlich etwas Schwieriges gab, das ich nicht erwischte).
Die Gesamtlaufzeit für diese Version (mit -Xmx512m) war 1:53. Das sind über 600000 Nummern / Sekunde; gar nicht so schlecht! Aber ich vermute, dass es langsamer gewesen wäre, wenn ich es nicht minimiert ausgeführt hätte.
Als ich das zum ersten Mal betrachtete, war meine erste Frage: "Wie definierst du das kleinste und das größte?" Für was ich dachte, war die offensichtlichste Definition ("kleinste" == "am nächsten zu 0") die Antwort wäre
%Vor%Aber alle anderen scheinen "klein" als "minimal" und "groß" als "maximal" zu lesen
Eine andere Möglichkeit, jeden Wert mit einem int-Typ zu durchlaufen.
%Vor%Angesichts der Übersicht über die besten Antworten wurde mir klar, dass es uns an der Brute-Force-Abteilung fehlt. Jays Antwort ist nett, aber es wird nicht funktionieren. Im Namen der Wissenschaft präsentiere ich - Bozo Range:
%Vor%Beachten Sie, dass Sie mindestens 4 GB RAM reservieren müssen, um dieses Programm ausführen zu können. (Möglicherweise 8 GB, wenn Sie auf einer 64-Bit-Maschine sind, die Sie wahrscheinlich benötigen, um dieses Programm tatsächlich auszuführen ...). Diese Analyse zählt nicht den Bloat, den die Integer-Klasse zu einem gegebenen int hinzufügt, noch die Größe des HashSet selbst.
Verbessern Sie einfach den Ansatz von StringBuilder
:
2 Threads + 2 Puffer (d. h. StringBuilder
): Die Grundidee ist, dass ein Thread einen Puffer füllt, während der andere Thread den Inhalt des anderen Puffers ablegt.
Offensichtlich läuft der "dumper" Thread immer langsamer als der "fill" Thread.
Tags und Links java