Java移除字符串连续重复字符:代码未达预期输出求助
问题分析与修复
输入字符串为aabbbcabcaa,期望输出为cabc,即只保留字符串中**单独出现(无连续重复)**的字符,所有连续重复的字符组(如aa、bbb)全部移除。
原代码的问题
- 循环起始位置错误:从
i=2开始遍历,直接跳过了前两个字符的判断逻辑,无法处理开头的连续重复组。 - 判断逻辑完全不符合需求:原条件
input.charAt(i) != input.charAt(i - 1) & input.charAt(i - 1) != input.charAt(i - 2)是在判断当前字符与前一个、前前一个都不同,这和“保留无连续重复的字符”的需求毫无关联,无法正确筛选出目标字符。 - 位运算符误用:使用了
&(按位与)而非&&(逻辑与),虽然此处结果可能一致,但属于语法规范问题。
修复后的代码
public class RemoveConsecutiveDuplicates { public static void main(String[] args) { String input = "aabbbcabcaa"; System.out.println(removeConsecutiveDuplicates(input)); } public static String removeConsecutiveDuplicates(String input) { if (input == null || input.length() <= 1) { return input; } StringBuilder result = new StringBuilder(); int length = input.length(); for (int i = 0; i < length; i++) { char current = input.charAt(i); // 判断当前字符是否是单独出现的(无连续重复) boolean isSingle = false; if (i == 0) { // 第一个字符,只需判断是否和下一个不同 isSingle = (current != input.charAt(i + 1)); } else if (i == length - 1) { // 最后一个字符,只需判断是否和前一个不同 isSingle = (current != input.charAt(i - 1)); } else { // 中间字符,需同时和前后都不同 isSingle = (current != input.charAt(i - 1)) && (current != input.charAt(i + 1)); } if (isSingle) { result.append(current); } } return result.toString(); } }
代码说明
- 边界处理:先判断输入为空或长度≤1的情况,直接返回原字符串,避免数组越界。
- 逐字符判断:
- 首字符:仅需和下一个字符比较,不同则保留
- 尾字符:仅需和前一个字符比较,不同则保留
- 中间字符:需同时和前后字符都不同,才判定为单独出现的字符,加入结果
- 逻辑运算符修正:使用
&&替代&,符合逻辑判断的语法规范。
运行上述代码,输入aabbbcabcaa将输出cabc,符合预期。
内容的提问来源于stack exchange,提问作者Shamali
相关产品推荐
相关产品推荐

