Java技术问题:如何仅移除指定字符的最大出现次数?
Java实现:移除指定字符的最长连续出现段
需求说明
给定字符串与目标字符,需移除该字符最长的连续出现段,保留其余部分。示例:
输入字符串:567000003460046,目标字符为'0'
输出结果:5673460046
说明:字符'0'存在两段连续出现(长度分别为5和2),移除长度最长的那一段后拼接剩余部分得到结果。
实现思路
- 遍历字符串,将连续相同字符的片段(含目标/非目标字符)拆分存入列表
- 在片段列表中定位出长度最大的目标字符连续段
- 拼接所有片段,跳过上述最长目标字符段,得到最终结果
- 处理边界场景:空输入、无目标字符、全为目标字符的情况
Java代码实现
import java.util.ArrayList; import java.util.List; public class RemoveLongestConsecutiveChar { public static String removeLongestConsecutiveChar(String input, char target) { if (input == null || input.isEmpty()) { return input; } // 拆分字符串为连续相同字符的片段列表 List<String> segments = new ArrayList<>(); StringBuilder currentSeg = new StringBuilder(); currentSeg.append(input.charAt(0)); for (int i = 1; i < input.length(); i++) { char curr = input.charAt(i); if (curr == currentSeg.charAt(0)) { currentSeg.append(curr); } else { segments.add(currentSeg.toString()); currentSeg = new StringBuilder(); currentSeg.append(curr); } } segments.add(currentSeg.toString()); // 找到最长的目标字符连续段的索引 int maxLen = -1; int targetIndex = -1; for (int i = 0; i < segments.size(); i++) { String seg = segments.get(i); if (seg.charAt(0) == target && seg.length() > maxLen) { maxLen = seg.length(); targetIndex = i; } } // 无目标字符时直接返回原字符串 if (targetIndex == -1) { return input; } // 拼接结果,跳过最长目标字符段 StringBuilder result = new StringBuilder(); for (int i = 0; i < segments.size(); i++) { if (i != targetIndex) { result.append(segments.get(i)); } } return result.toString(); } public static void main(String[] args) { String testInput = "567000003460046"; char targetChar = '0'; System.out.println(removeLongestConsecutiveChar(testInput, targetChar)); // 输出:5673460046 } }
代码说明
- 片段拆分:通过一次遍历将字符串拆分为连续相同字符的片段,便于后续定位目标字符的连续段
- 最长段定位:遍历片段列表,筛选出目标字符的片段,记录长度最大的那个的位置
- 结果拼接:遍历片段列表时跳过最长目标字符段,拼接其余片段得到最终字符串
- 边界处理:针对空输入、无目标字符的情况直接返回原输入;若全为目标字符,移除后返回空字符串
内容的提问来源于stack exchange,提问作者Roshni Sinha
相关产品推荐
相关产品推荐

