2017-10-02 6 views
0

J'exécutait la petite classe Java pour résoudre le problème de chaîne sur HackerRank:Java- Chaîne: java.lang.OutOfMemoryError: Java heap space

Compte tenu de la chaîne, trouver sa forme non réductible, étant donné valide L'opération consiste à supprimer toute paire de lettres adjacentes de même valeur.

Ex:

"aabcc" would become either "aab" or "bcc" after 1 operation.

Cependant, je veux juste mentionner sur le bloc de code entourant cette erreur. Bien que j'ai pu résoudre le problème tout à fait bien, je me suis laissé tenter par d'autres pour améliorer la performance du temps de la solution en utilisant la meilleure approche de StringBuilder()

Mais je ne l'ai pas compris pourquoi le comportement de append() dans ma classe StringBuilder peut conduire à un débordement de mémoire ou à toute sorte d'inconduite plus compliquée.

Voici le code:

static String super_reduced_string(String s){ 
    StringBuilder res = new StringBuilder(); 
    for (int i = 1; i < s.length(); i++){ 
     if (s.charAt(i-1) == s.charAt(i)){ 
      /* waste so much memory leak!!! java.lang.OutOfMemoryError: Java heap space 
      //s = res.append(s.substring(0, i-1)).append(s.substring(i+1)).toString(); 
      */ 
      s = s.substring(0, i-1) + s.substring(i+1); 
      i = 0; 
     } 
    } 
    //then check if it's non-empty, print it out 
    if (s.length() != 0){ 
     return s; 
    } 
    return "Empty String"; 
} 

La partie où j'ai commenté la mauvaise conduite est mentionné ci-dessus. S'il vous plaît veuillez m'aider à raisonner à travers ce bug, et le déboguer! Ça ne devrait pas être si difficile.

Répondre

0

Effacez simplement le générateur de chaîne après l'affectation à l'art.

s = res.append(s.substring(0, i-1)).append(s.substring(i+1)).toString(); 
res.setLength(0);