2016-10-09 6 views
1

Ich arbeite meinen Weg durch Projekt Euler, und auf Problem 4 funktioniert mein Palindrom-Code nicht. Insbesondere gibt es 998001 (999 * 999) zurück, als wäre es ein Palindrom.Nummer Palindrom-Code funktioniert nicht

Der Code, um das Palindrom zu überprüfen funktioniert, aber es bleibt Schleifen und ersetzt den Maximalwert, obwohl es kein Palindrom ist. Was vermisse ich?

Danke für Ihre Hilfe

public int palindromeNumber() 
{ 
    int max=0; 
    for(int x = 100; x<1000; x++) 
    { 
     for(int y = 100; y<1000; y++) 
     { 
      int z = x*y; 
      StringBuilder num = new StringBuilder(Integer.toString(z)); 
      StringBuilder rev = num.reverse(); 
      if(num==rev) 
      { 
       max=z; 
      } 
     } 
    } 
    return max; 
} 
+2

Mögliche Duplikat [Wie kann ich Strings in Java? Vergleichen] (http://stackoverflow.com/questions/513832/how-do-i-compare-strings-in-java) – Biffen

+0

Verwendung .equals() um Strings zu vergleichen –

Antwort

5

Wenn Sie einen Blick auf die StringBuilder.reverse() -Methode nehmen sie den Verweis auf das gleiche Objekt zurückgibt (num in Ihrem Fall)

@Override 
public StringBuilder reverse() { 
    super.reverse(); 
    return this; 
} 

So Sie rev == num ist immer wahr und Sie erhalten die 999 * 999, weil es das Ende einer Schleife ist

4

Ihr Code ist korrekt, jedoch, wie die Kommentare darauf hingewiesen haben, vergleichen Sie Adressen anstelle von Zeichenfolgen.

Ein String ist ein Objekt, kein primitiver Typ, also funktioniert '==' nicht, wenn Sie Original und umgekehrt vergleichen.

Stattdessen müssen Sie die .equals(String) Methode verwenden.

Hier ist ein Einzeiler Proof of Concept:

max = (num.equals(new StringBuilder(Integer.toString(z)).reverse())) ? z : max; 

Hinweis:

Aus Performance-Gründen, könnten Sie wollen versuchen, diese numerisch zu implementieren, Umwandlungen und nehmen Sie sich Zeit Parsen.

Schnell Proof of Concept:

num = origNum 
while (num > 0) 
{ 
     digit = num % 10; 
     rev = rev * 10 + digit; 
     num = num/10; 
} 

if (origNum == rev) //max.. 
0
Please make some changes as - 

public static int palindromeNumber() 
{ 
    int max=0; 
    for(int x = 100; x<1000; x++) 
    { 
     for(int y = 100; y<1000; y++) 
     { 
      int z = x*y; 
      StringBuilder num = new StringBuilder(Integer.toString(z)); 
      StringBuilder numberCopy = new StringBuilder(num); 
      StringBuilder rev = num.reverse(); 

      if(numberCopy.toString().equals(rev.toString())) 
      { 
       max=z; 
      } 
     } 
    } 
    return max; 
} 

Das Problem in Ihrem Code ist, dass, wenn Sie rev = num.reverse(); Dann jedes Mal in der Schleife Es ändern Sie das gleiche Objekt-Nummer mit umgekehrten Nummer und dann zu Rev zuweisen. Jetzt referenzieren beide referenznummer & rev auf das gleiche modifizierte Objekt (num und rev Wert ist 999 in letzter Iteration)

Dann verwenden Sie == welche überprüfen Referenz zeigen auf das gleiche Objekt oder nicht, und hier num und rev zeigt auf dasselbe Objekt, so dass die Bedingung jedes Mal wahr ist.

Lösung -

  1. Kopie Objekt auf ein anderes Objekt vor dem Ändern der zum Vergleich später verwendet werden kann.

  2. Verwenden Sie gleich, um Werte stattdessen zu vergleichen ==.

+0

Während dieser Code das Problem des Fragestellers lösen kann, sollten Sie ihn [bearbeiten], um zu erklären, wie es funktioniert und wie es sich von dem unterscheidet, was der Fragesteller versucht hat. – dorukayhan

+0

@dorukayhan Danke für den Vorschlag. Bearbeitete Antwort. – Ravi

+0

Ich habe es geändert, aber jetzt bekomme ich 580085. – cuttlefish

Verwandte Themen