Palindrom

Kirby.exe

Top Contributor
Ich muss als Übungsaufgabe einen Code schreiben, der bei einem Wort schaut ob es ein Palindrom ist. Das habe ich auch soweit geschafft, jedoch muss ich, wenn es kein Palindrom ist ausgeben an welcher Stelle es nicht gleich ist. Ich wüsste nicht wie ich das tun könnte. Hier meinen Code:
Java:
public class Palindromtest {

    public static void main(String[] args) {
        String input = "otto";//args[0];
        char[] inputary = input.toCharArray();
        
        System.out.println(istPalindrom(inputary)); 

    }
    
    public static boolean istPalindrom(char[] input){
        boolean palindrom = false;
        if(input.length%2 == 0){
            for(int i = 0; i < input.length/2-1; i++){
                if(input[i] != input[input.length-i-1]){
                    return false;
                }else{
                    palindrom = true;
                }
            }
        }else{
            for(int i = 0; i < (input.length-1)/2-1; i++){
                if(input[i] != input[input.length-i-1]){
                    return false;
                }else{
                    palindrom = true;
                }
            }
        }
        return palindrom;
    }

Ich bedanke mich im voraus schonmal für jeden Denkanstoß :)
 
K

kneitzel

Gast
Falls dein Problem ist, dass Du Ausgabe von Berechnung trennen willst, dann solltest Du Dir überlegen, was die Rückgabe sein kann.

Ein boolean Wert und noch die Stelle kannst Du nicht zurück geben, da Du nur eine Rückgabe hast. Eine Klasse erstellen ist evtl. nicht erlaubt. Also musst Du dir überlegen, was Du als Rückgabe machen kannst. Dazu würde ich mir immer aufschreiben, was denn die möglichen Rückgaben wären:

false + Zahl zwischen 0 und length-1
true

Also könnte man doch nur eine Zahl zurück geben: Dies ist die Stelle, ab der es kein Palindrom ist oder -1, falls es keine solche Stelle gibt (= es ist ein Palindrom).
Dann hättest Du einen Weg gefunden, dass Du das Ergebnis über einen Wert zurück gibst.
 

Kirby.exe

Top Contributor
Ich weiß dass die Ausgabe und Rechnung nicht in einer Method sein können, da eine boolean Method keinen String oder Integer Ausgeben kann. Jedoch überlege ich die ganze Zeit wie ich die Rechnung und die Ausgabe trennen könnte. Da ich ja in der Ausgabe abfragen müsste ob es true oder false ist und wenn es falls ist die Stelle wo.

Das Problem ist die Test Umgebung erwartet bei keinem Palindrom die Ausgabe:
false
Stelle wo es scheitert
 
K

kneitzel

Gast
Ist denn die Methode so fest vorgegeben?

Denn wie gesagt: Wenn Du es zu einem int änderst, dann kannst Du die Ausgabe wie gewünscht machen.
 

Kirby.exe

Top Contributor
Ich hatte da jetzt ab so etwas gedacht aber scheinbar bin ich da sehr falsch :(

Java:
public static int output(char[] input){
        boolean palindrom = false;
        
            for(int i = 0; i < input.length/2-1; i++){
                if(input[i] != input[input.length-i-1]){
                    return input[i];
                }
        }
        
    }
 
K

kneitzel

Gast
Was willst du zurück geben? Es geht doch um die Stelle. Also was müsstest du zurück geben?
Und was willst du zurück geben, wenn die Schleife durchlaufen wurde und die Bedingung des if nie wahr war?
 

Kirby.exe

Top Contributor
Naja ich möchte dass er die Stelle angibt wo beim Vergleich ein Widerspruch entsteht, beispielsweise bei dem Wort OttoR. Er soll diese Stelle ausgeben wenn es kein Palindrom ist. Jedoch wenn es eins ist dann soll nur true ausgegeben werden
 
K

kneitzel

Gast
Dann gehen wir zur nächsten Frage: Was ist denn die Stelle, wenn die if Bedingung wahr ist?

und die letzte Frage vom letzten Post ist auch noch offen.
 

Kirby.exe

Top Contributor
Can some one explain to me what I`m doing wrong? :(
There is the following error message:
Exception in thread "main" java.lang.Error: Unresolved compilation problem:


The method output(char[], char) in the type Palindromtest is not applicable for the arguments (char[])





at Palindromtest.main(Palindromtest.java:12)


Java:
public class Palindromtest {

    public static void main(String[] args) {
        String input = "Regallager";//args[0];
        input = new String(input.toLowerCase());
        input = new String(input.trim());
        char[] inputarray = input.toCharArray();
        char[] outputarray = input.toCharArray();
        
        System.out.println(istPalindrom(inputarray));
        System.out.println(output(outputarray));

    }
    
    public static boolean istPalindrom(char[] input){
        boolean palindrom = false;
        
            for(int i = 0; i < input.length/2-1; i++){
                if(input[i] != input[input.length-i-1]){
                    return false;
                }else{
                    palindrom = true;
                }
            
        }
        return palindrom;
    }
    
    public static char output(char[] input, char output){
              
            for(int i = 0; i < input.length/2-1; i++){
                if(input[i] != input[input.length-i-1]){
                    
                    output = input[i];
                    return output;
                }
        }
            return output;
        
    }
}
 

mihe7

Top Contributor
Can some one explain to me what I`m doing wrong? :(

Sure:
public static char output(char[] input, char output){
2 Parameters

System.out.println(output(outputarray));
1 Parameter

Aber eigentlich sollten wir deutsch schreiben können. Schreib die Methode output mal um:
Java:
    public static char output(char[] input) {
        char output = 0;
        ...
 

Kirby.exe

Top Contributor
Also ich habe ein paar Sachen geändert und prinzipiell funktioniert auch alles nur wenn es kein Palindrom ist gibt er keine Zahl sondern einen Buchstaben aus:

Java:
public class Palindromtest {

    public static void main(String[] args) {
        String input = "RegallagerG";//args[0];
        input = new String(input.toLowerCase());
        input = new String(input.trim());
        char[] inputarray = input.toCharArray();
        char[] outputarray = input.toCharArray();
        //char output;
        
        System.out.println(istPalindrom(inputarray));
        System.out.println(output(outputarray));

    }
    
    public static boolean istPalindrom(char[] input){
        boolean palindrom = false;
        
            for(int i = 0; i < input.length/2-1; i++){
                if(input[i] != input[input.length-i-1]){
                    return false;
                }else{
                    palindrom = true;
                }
            
        }
        return palindrom;
    }
    
     public static char output(char[] input) {
            char output = 0;
            for(int i = 0; i < input.length/2-1; i++){
                if(input[i] != input[input.length-i-1]){
                    output = input[i];
                    //return output;
                }
        }
            return output;
    
    }
}
 

mihe7

Top Contributor
nur wenn es kein Palindrom ist gibt er keine Zahl sondern einen Buchstaben aus:
Ach, geht es immer noch um das Problem von oben?

Java:
    public static int istPalindrom(char[] input){
        for(int i = 0; i < input.length/2-1; i++){
            if(input[i] != input[input.length-i-1]){
                return i; // es ist kein Palindrom, Grund ist an Position i zu finden
            }
        }
        return -1; // es ist ein Palindrom
    }

Java:
int ergebnis = istPalindrom(input);
if (ergebnis != -1) {
    System.out.printf("Kein Palindrom. Fehler beim %d-ten Buchstaben\n", ergebnis+1);
} else {
    System.out.println("OK, Palindrom.");
}
 

Kirby.exe

Top Contributor
Warum gibt das Programm keine Stelle bei "abc" aus?:

Java:
public class Palindromtest {

    public static void main(String[] args) {
        String input = args[0];
        input = new String(input.toLowerCase());
        input = new String(input.trim());
        char[] inputarray = input.toCharArray();
       
        System.out.println(istPalindrom(inputarray));
        int ergebnis = output(inputarray);
        if (ergebnis != -1) {
            System.out.printf("%d\n", ergebnis+1);
        }

    }
   
    public static boolean istPalindrom(char[] input){      
        boolean palindrom = false;
        if(input.length%2 == 0){
            for(int i = 0; i < input.length/2-1; i++){
                if(input[i] != input[input.length-i-1]){
                    return false;
                }else{
                    palindrom = true;
                }
            }
        }else{
            for(int i = 0; i < (input.length-1)/2-1; i++){
                if(input[i] != input[input.length-i-1]){
                    return false;
                }else{
                    palindrom = true;
                }
            }
        }
        return palindrom;
    }
   
     public static int output(char[] input) {
       if(input.length%2 == 0){
            for(int i = 0; i < input.length/2-1; i++){
                if(input[i] != input[input.length-i-1]){
                    return i; //es ist kein Palindrom
                }
            }
            }else{
            for(int i = 0; i < (input.length-1)/2-1; i++){
                if(input[i] != input[input.length-i-1]){
                    return i; //es ist kein Palindrom
                }
            }
        }
        return -1; // es ist ein Palindrom
       
    }
}
 
K

kneitzel

Gast
"abc" hat Länge 3.
3-1 = 2. (input.length -1)
2/2 = 1 (das /2)
1-1 = 0 (das -1)
Damit hast Du eine Schleife for (int i=0; i<0; i++) ==> Wird nie durchlaufen!
 
K

kneitzel

Gast
Geh doch einmal exemplarisch durch: Bis wohin musst Du prüfen bei 3,5,7,... Zeichen? Und wie weit bei 2,4,6,8,...?

Und bei ungerader Länge spielt es keine Rolle, ob Du erst 1 abziehst oder nicht: (3-1) / 2 = 1; 3 / 1 = 1 (Da es ja Integer sind!)

Und da Du ein Zeichen zu wenig kontrolliert hast, ist doch eigentlich auch offensichtlich, was der Fehler sein muss.
 

mihe7

Top Contributor
Es gibt zwei Fälle:
1. n ist gerade, d. h. es gibt ein k mit n = 2k. In dem Fall musst Du k Stellen untersuchen, nämlich von 0 bis k-1
2. n ist ungerade, d. h. es gibt ein k mit n =2k+1. In dem Fall musst Du ebenfalls nur k Stellen untersuchen, nämlich von 0 bis k-1.

Mit n = input.length ist k = input.length/2 also:

for(int i = 0; i < input.length/2; i++){
 

Kirby.exe

Top Contributor
Also ich muss ehrlich gesagt sagen, dass ich gerade irgendwie auf dem Schlauch stehe :( also ungefähr habe ich verstanden wo das Problem liegt, jedoch habe ich gerade keinen Schimmer wie ich das implementiere
 
Zuletzt bearbeitet:

Kirby.exe

Top Contributor
Habe es jetzt so, jedoch gibt er trotzdem bei abc nicht 0 sondern 1 aus
Code:
public class Palindromtest {

    public static void main(String[] args) {
        String input = "abc";//args[0];
        input = new String(input.toLowerCase());
        input = new String(input.replaceAll("\\s", ""));
        char[] inputarray = input.toCharArray();
        
        System.out.println(istPalindrom(inputarray));
        int ergebnis = output(inputarray);
        System.out.printf(ergebnis+1);
        

    }
    
    public static boolean istPalindrom(char[] input){       
        boolean palindrom = false;
          
            for(int i = 0; i < input.length/2; i++){
                        if(input[i] != input[input.length-i-1]){
                            return false;
                        }else{
                            palindrom = true;
                        }
                    }
                
                return palindrom;
    }
    
     public static int output(char[] input) {
          
             for(int i = 0; i < input.length/2; i++){
                if(input[i] != input[input.length-i-1]){
                    return i; //es ist kein Palindrom
                }
            }
        return -1; // es ist ein Palindrom
   }
    
}
 

mihe7

Top Contributor
Denk Dir nichts, manchmal sieht man den Wald vor lauter Bäumen einfach nicht mehr. Aber Du kannst auf die nochmalige Implementierung in der Methode istPalindrom verzichten: istPalindrom() liefert genau dann true, wenn output() den Wert -1 liefert.

Dein Code reduziert sich dann zu
Java:
public class Palindromtest {

    public static void main(String[] args) {
        String input = "abc";//args[0];
        input = new String(input.toLowerCase());
        input = new String(input.replaceAll("\\s", ""));
        char[] inputarray = input.toCharArray();
      
        System.out.println(istPalindrom(inputarray));
        int ergebnis = output(inputarray);
        System.out.printf(ergebnis+1);
    }
  
    public static boolean istPalindrom(char[] input){
        return output(input) == -1;
    }
  
    public static int output(char[] input) {        
       for(int i = 0; i < input.length/2; i++){
           if(input[i] != input[input.length-i-1]){
               return i; //es ist kein Palindrom
           }
       }
       return -1; // es ist ein Palindrom
    } 
}
 

Kirby.exe

Top Contributor
Dankeschön :) Ich bin ja noch relativ am Anfang mit Java :) bin im 1. Semester. Ich kenne es aber auch noch von Python mit den schönen Error Codes wie Input After end of line ;)
 

Kirby.exe

Top Contributor
Also ich hab das Programm nochmal in die Testumgebung der Uni geschmissen und bei 2 der Test habe ich immer noch den falschen Index raus. Ich habe die Index Ausgabe etwas verändert und nochmal in 2 Methode aufgeteilt :)

Die Test Wörter sind:

- O Genie der Herr ehre mein Ego
- O Genie der Herr ehre dein Memo

Hier der geänderte Code:

Java:
public class Palindromtest {

    public static void main(String[] args) {
        String input = "O Genie der Herr ehre dein Memo";//args[0];
        input = new String(input.toLowerCase());
        String input_copy = input;
        char [] input_n_array = input.toCharArray();
        input = new String(input.replaceAll("\\s", ""));
        char[] inputarray = input.toCharArray();
        
        System.out.println(input_n_array);
        System.out.println(inputarray);
    
        System.out.println(istPalindrom(inputarray));
        int result = output(input_copy);
        System.out.println(result);
        /*int ergebnis = output(inputarray);
        if(ergebnis != -1) {
            System.out.println(ergebnis);
        }*/

    }
    
    public static boolean istPalindrom(char[] input){       
        boolean palindrom = false;
            for(int i = 0; i < input.length/2; i++){
                if(input[i] != input[input.length-i-1]){
                    return false;
                }else{
                    palindrom = true;
                }
            }
        return palindrom;
    }
    
    
       public static String calc(String input_copy) {
           String stuff = "";
           String addableString;
           char newChar;
          // int j = 0;
           for(int i = input_copy.length()-1; i>=0; i--) {
               newChar = input_copy.charAt(i);
               addableString = String.valueOf(newChar);
               stuff = stuff.concat(addableString);
              
              
           }
          
           return stuff;
          
           /*for(int i = 0; i < input_copy.length/2; i++){
                if(input_copy[i] != input_copy[input_copy.length-i-1]){
                    return i; //es ist kein Palindrom
                }
            }
        return -1; // es ist ein Palindrom*/
   }
  
       public static int output(String input_copy) {
           String stuff = "";
           stuff = calc(stuff);
           int result = -1;
           for(int i = 0; i <= input_copy.length()-1; i++) {
               if(stuff.charAt(i) != input_copy.charAt(i)) {
                   result = i;
               }
           }
           return result;
       }
    
}
 

mihe7

Top Contributor
Also ich hab das Programm nochmal in die Testumgebung
Was ruft denn die Testumgebung auf? Deine main-Methode oder eine andere? Was wird denn genau als Ausgabe erwartet?

Der Code
Java:
public class Test {
    public static void main(String[] args) {
        String test[] = {
            "O Genie der Herr ehre mein Ego",
            "O Genie der Herr ehre dein Memo"
        };
        for (String input : test) {
            input = input.toLowerCase().replaceAll("\\s", "");
            System.out.println(input);
            char[] inputarray = input.toCharArray();
            System.out.println(istPalindrom(inputarray));
            int ergebnis = output(inputarray);
            System.out.println(ergebnis);
        }
    }

    public static boolean istPalindrom(char[] input){
        return output(input) == -1;
    }

    public static int output(char[] input) {
       for(int i = 0; i < input.length/2; i++){
           if(input[i] != input[input.length-i-1]){
               return i; //es ist kein Palindrom
           }
       }
       return -1; // es ist ein Palindrom
    }
}
Liefert als Ausgabe
Code:
ogeniederherrehremeinego
false
6
ogeniederherrehredeinmemo
false
1
was mir ziemlich korrekt erscheint :)
 

Kirby.exe

Top Contributor
Also die Aufgabe ruft die Main auf.

jedoch soll bei O Genie der Herr ehre mein Ego die Zahl 8 ausgegeben werden und bei O Genie der Herr ehre dein Memo die Zahl 2.
 

Kirby.exe

Top Contributor
Ahhh ich glaube du musst es in 2 Strings speichern einmal mit Leerzeichen und einmal ohne :) ich mache des nachher mal muss jetzt erstmal Mathe Lineare Algebra machen :(
 

mihe7

Top Contributor
Code:
Runde I

1. Positioniere i und j

 o genie der herr ehre dein memo
 ^                             ^  
 i                             j  

2. Gilt i < j? Dann weiter, sonst wurde ein Palindrom gefunden.

3. Vergleiche Buchstaben an den Stellen i und j, 
   da sie gleich sind, weiter mit der nächsten Runde

----

Runde II

1. Positioniere i und j

 o genie der herr ehre dein memo
  ^                           ^  
  i                           j  <-- j ist OK, i nicht, denn c[i] == ' '

 o genie der herr ehre dein memo
   ^                          ^  
   i                          j  <-- jetzt sind i und j OK.

2. Gilt i < j? Dann weiter, sonst wurde ein Palindrom gefunden. 

3. Vergleiche Buchstaben an den Stellen i und j,
   da sie verschieden sind, handelt es sich um kein Palindrom. 
   Problemstelle ist i.
 

mihe7

Top Contributor
Mal ein Algorithmus:
Code:
i := 0
j := len(c) - 1
so lange i < j wiederhole {
    falls c[i] == ' ', dann erhöhe i
    sonst falls c[j] == ' ', dann verringere j
    sonst falls c[i] == c[j], dann erhöhe i und verringere j
    sonst gib i zurück
}
gib -1 zurück
 

Kirby.exe

Top Contributor
Also ich hab es jetzt ganz umgeschrieben und deine Tipps berücksichtigt, jedoch weiß ich nicht wie ich in einer boolischen Methode einen Integer zur Main schicke
 

Neue Themen


Oben