我正在实现小Java类来解决Hackerrank上的字符串问题:
给定字符串,找到其不可简化的形式,考虑一个有效的操作是删除任何一对具有相同值的相邻字母。
例如:
“aabcc”在1次手术后将成为“aab”或“bcc”。
但是,我只想提一下围绕此错误的代码块。虽然我能够很好地解决这个问题,但我很想通过使用 StringBuilder()
的更好方法来提高解决方案的时间性能。但我还没弄清楚为什么 append()在我的 StringBuilder 类中的行为可能导致内存溢出或任何更复杂的错误行为。
以下是代码:
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";
}
我评论的部分是上面提到的不良行为。请帮助我理解这个错误,并调试它!它不应该那么难。
答案 0 :(得分:0)
在分配给s后,只需清除字符串构建器。
s = res.append(s.substring(0, i-1)).append(s.substring(i+1)).toString();
res.setLength(0);