Meine Lösung funktioniert schon, aber unsicher ob es ein gutes Code ist

morry329

Mitglied
Hallo zusammen,

ich habe für eine Projekt-Eular-Aufgabe das folgende Code ausprogrammiert. Aufgabestellung hier
Es liefert die angeforderte Ausdrücke zurück, dennoch bin ich nicht ganz sicher ob meine Lösung schön ist. Vielleicht könnt ihr Tipps geben? Vielen Dank vorab.

Java:
public class LargestPalindrome {
    public static void main(String[] args){
        var obj = new LargestPalindrome();

        var multiple = obj.calc();
        System.out.println(multiple);
    }

    public int calc(){
        int result = 0;
        for(int i = 1; i < 1000; i++){
            Set<Integer> hs = new HashSet<Integer>();
            if(hs.contains(i)){
                hs.remove(i);
            } else {
                hs.add(i);
            }
            int largest = Collections.max(hs);
            System.out.println("largest is " + largest);
            int secondLargest = largest - 1;
            //System.out.println("second largest is " + secondLargest);
            result = largest * secondLargest;
        }
        return result;
    }
}
 

httpdigest

Top Contributor
Deine "Lösung" ist leider nicht korrekt (nicht einmal im Ansatz) und liefert ganz bestimmt auch nicht das richtige Ergebnis.
Letztlich berechnest du nur unnötig umständlich 999*998=997002, was auch kein Parlindrom ist, laut der Definition der Aufgabestellung.

Du erzeugst in jedem Schleifendurchlauf ein neues leeres HashSet, fügst diesem dann immer als einziges Element das aktuelle i hinzu, ermittelst dasselbe i dann per Collections.max() und überschreibst result immer mit i*(i-1).
 

M.L.

Top Contributor
Weiterhin soll man bei Projekt Euler nicht "stumpf drauf-los-rechnen", sondern Strukturen und Gesetzmäßigkeiten anwenden um möglichst wenig zu rechnen. Im konkreten Fall also eine Endzahl mit der Struktur "abccba" (a vermutlich 9, ansonsten dekrementieren). Für 9 als letzte Zahl kommen u.a. ..9*1, ..3*..3, ..1*..9 in Frage
 

Robert Zenz

Top Contributor
Code:
java
var obj = new LargestPalindrome();
`
obj ist ein schlechter Name, du solltest deine Variablennamen immer nach dem waehlen was sie tun oder was sie enthalten. Desweiteren bin ich kein Freund von var, aber da kann man darueber streiten.


Java:
        var multiple = obj.calc();
        System.out.println(multiple);
Also...du hast das Objekt LargestPalindrome, darauf rufst du die Methode calc auf und bekommst multiple...das wirkt alles schlecht bis falsch benannt und verwirrend.

Java:
public int calc(){
Selbes hier, calc ist jetzt nicht der aussagekraeftigste Namen den man der Methode geben koennte. Habe nie Angst davor lange Namen zu verwenden. Gute und auch lange Namen machen den Code besser lesbar.

Java:
            Set<Integer> hs = new HashSet<Integer>();
            if(hs.contains(i)){
                hs.remove(i);
            } else {
                hs.add(i);
            }
Yeah, ich darf wieder auf meine Wiederholung zum Thema Boxing verweisen.

Java:
System.out.println("largest is " + largest);
Ausgaben sollten nicht in der Berechnungsmethode sein.

---

Ansonsten das was @httpdigest gesagt hat, es macht viele Dinge, aber nicht das was du meinst dass es macht.
 

AndiE

Top Contributor
Ich habe das durchprogrammiert. Es gibt erstaunlicherweise eine ganze Reihe Palidrome in diesem Bereich und die Lösung ist der zweistelligen nicht unähnlich.
 

Neue Themen


Oben