2016-06-23 5 views
0

Ich arbeite an folgenden CodingBat problem:Leeres Ergebnis in einem rekursiven Java Aufruf

einen String gegeben, dass ein einzelnes Paar von Klammern enthält, berechnet rekursiv eine neue Zeichenfolge aus nur der Klammer und dessen Inhalts , so ergibt "xyz (abc) 123" "(abc)".

parenBit("xyz(abc)123") → "(abc)" 
parenBit("x(hello)") → "(hello)" 
parenBit("(xy)1") → "(xy)" 

ich versucht, es so zu lösen:

import java.util.LinkedList; 
import java.util.List; 

public class ParenBit { 
    public static void main(String arg[]) { 
     ParenBit p = new ParenBit(); 
     p.solve(arg[0], '(', ""); 
     System.out.println(p.finalResult.toString()); 
    } 

    private List<String> finalResult = new LinkedList<String>(); 

    private boolean solve(String s, char c, String result) { 
     if (s.length() == 0) 
      return false; 
     char f = s.charAt(0); 
     if (f == '(') { 
      boolean b = solve(s.substring(1), ')', result); 
      if (b) { 
       result += f + ""; 
      } 
      if (f == c) 
       return true; 
     } else if (f == ')') { 
      if (c == f) { 
       result += f + ""; 
       finalResult.add(result); 
       solve(s.substring(1), '(', ""); 
       return true; 
      } 
     } else { 
      if (c == ')') { 
       boolean b = solve(s.substring(1), ')', result); 
       if (b) { 
        result += f + ""; 
       } 
      } else if (c == '(') { 
       return solve(s.substring(1), '(', result); 
      } 
     } 
     return false; 
    } 
} 

Wenn ich es mit diesem Eingang genannt:

wow (These)

ich leere Ergebnisse. Wie kann ich das beheben?

+3

Sicher mit dem rep, würden Sie wissen, nicht nur, um uns ein Problem und nicht versuchen, es selbst zu debuggen. Auch nehmen wir keine Aufgaben .. – Li357

+0

@AndrewL. Es ist keine Aufgabe, es ist ein quesiotn online Ich versuche rekursiv zu lernen –

+2

Was sind Ihre Versuche, das Programm zu debuggen? – Li357

Antwort

1

Wenn ich Ihren Code in meine IDE einfügen, es sagt mir

if (b) { 
    result += f + ""; 
} 

Der Wert f + "" zugewiesen 'result' nie verwendet wird.

Bedeutung Sie den result Parameter aktualisieren, aber Sie nie den aktualisierten Wert als Ergebnis verwenden Sie immer solve() Methode mit einem leerresult Parameter nennen.

0

Ihr Code wurde aktualisiert. Angesichts Ihrer Rep Sie hätten in der Lage sein, darüber nachzudenken.

Auch wenn Sie das Ergebnis richtig erhalten müssen, sollten Sie List nicht verwendet haben. Einfacher String hätte es getan.

Ein paar weitere Eingaben. Versuchen Sie einfach, die Anweisungen zu befolgen. CodingBat hat erwartet, dass Sie eine Methode schreiben, die einen String zurückgibt, schreiben Sie kein Programm, um die Ausgabe in einer Variablen zu speichern.

private String finalResult = ""; 

private boolean solve(String s, char c, String result) { 
    if (s.length() == 0) 
     return false; 
    char f = s.charAt(0); 
    if (f == '(') { 
     result="("; 
     boolean b = solve(s.substring(1), ')', result); 
     if (b) { 
      result += f + ""; 
     } 
     if (f == c) 
      return true; 
    } else if (f == ')') { 
     if (c == f) { 
      result += f + ""; 
      finalResult = result; 
      //finalResult.add(result); 
      solve(s.substring(1), '(', ""); 
      return true; 
     } 
    } else { 
     if (c == ')') { 
      result += f + ""; 
      boolean b = solve(s.substring(1), ')', result); 
      /*if (b) { 
       result += f + ""; 
      }*/ 
     } else if (c == '(') { 
      return solve(s.substring(1), '(', result); 
     } 
    } 
    return false; 
} 
0
private boolean solve(String s, char c, String result) { 

    int bpos = s.lastIndexOf(c); 
    int epos = s.indexOf(')'); 

    if ((bpos == -1) || (epos == -1) || (epos < bpos)) { 
     return false; 
    } 

    result = s.substring(bpos,++epos); 
    finalResult.add(result); 

    return true; 
} 
Verwandte Themen