Java实现相邻字符去重功能时数组索引越界的最优解决方案咨询
解决方案
你当前代码的核心问题是遍历逻辑只处理了前n-1个字符,最后一位始终没有被加入结果,最轻量化的修复只需要在循环结束后追加最后一位字符即可,修正后的代码如下:
public String removeDuplicates(String source){ if(source.length() < 2){ return source; } StringBuilder noDuplicates = new StringBuilder(); char[] string = source.toCharArray(); for(int i = 0; i < string.length - 1; i++){ if(string[i] != string[i+1]){ noDuplicates.append(string[i]); } } // 追加最后一位字符,解决丢失问题 noDuplicates.append(string[string.length - 1]); return noDuplicates.toString(); }
验证说明
以输入ABBCDEF为例:
- 循环遍历前6位(下标0到5),当下标1的
B和下标2的B相等时不追加,其余符合不等条件的字符依次追加 - 循环结束后追加最后一位
F
最终输出ABCDEF,完全符合预期,同时循环上限设为string.length -1不会出现下标越界问题。
如果需要兼容更复杂的相邻重复场景(例如AABBCC连续多组重复、甚至ABBA类嵌套相邻重复),也可以改用栈式实现:
public String removeDuplicates(String source){ if(source.length() < 2){ return source; } StringBuilder stack = new StringBuilder(); for (char c : source.toCharArray()) { int len = stack.length(); // 栈顶和当前字符相等则弹出栈顶(去重),否则压入当前字符 if(len > 0 && stack.charAt(len -1) == c) { stack.deleteCharAt(len -1); } else { stack.append(c); } } return stack.toString(); }
内容的提问来源于stack exchange,提问作者just_curious
相关产品推荐
相关产品推荐

