如何从字符串中移除指定字符的对应次数出现?
按字符出现次数精准移除对应字符的解决方案
你的代码问题出在使用了replace(char, char)——这个方法会一次性替换字符串中所有匹配的字符,完全没考虑表达式里每个字符的出现次数,而且嵌套循环的逻辑会重复触发全替换,自然达不到只移除对应次数的效果。
正确实现思路
要实现精准移除对应次数的字符,核心是先统计表达式中每个字符的需求次数,再遍历输入字符串逐个判断是否保留:
- 统计表达式中每个字符的出现次数
- 遍历输入字符串的每个字符:
- 如果该字符还有需要移除的剩余次数,跳过它并减少剩余次数
- 否则保留该字符
- 拼接保留的字符得到结果
实现代码
// 辅助方法:统计字符串中每个字符的出现次数 private static Map<Character, Integer> countCharOccurrences(String str) { Map<Character, Integer> countMap = new HashMap<>(); for (char c : str.toCharArray()) { countMap.put(c, countMap.getOrDefault(c, 0) + 1); } return countMap; } // 核心处理方法:移除inventory中与expression字符出现次数对应的字符 public static String removeMatchingOccurrences(String inventoryPlayer1, String expression) { // 复用你原有的检查逻辑:确保expression的字符在inventory中数量足够 if (!isExpressionInInventory(expression, inventoryPlayer1)) { return inventoryPlayer1; } Map<Character, Integer> expCharCount = countCharOccurrences(expression); StringBuilder resultBuilder = new StringBuilder(); for (char c : inventoryPlayer1.toCharArray()) { Integer remainingRemovals = expCharCount.get(c); if (remainingRemovals != null && remainingRemovals > 0) { // 还有需要移除的次数,跳过当前字符,减少剩余次数 expCharCount.put(c, remainingRemovals - 1); } else { // 无需移除,保留当前字符 resultBuilder.append(c); } } return resultBuilder.toString(); }
代码说明
- 用
HashMap统计表达式字符的出现次数,能精准记录每个字符需要移除的次数 - 用
StringBuilder拼接结果,避免字符串不可变带来的性能损耗 - 遍历输入字符串时逐个判断,严格控制移除次数,完全匹配你的需求:
比如输入"111234++"和表达式"11+",最终会输出"1234+"
原代码的其他问题
你原代码中在循环内修改inventoryPlayer1和expression的内容,会导致后续循环的字符串长度和内容变化,逻辑混乱;而且replace方法的全替换行为从根本上不符合“按次数移除”的需求,这两个问题是导致失败的核心原因。
内容的提问来源于stack exchange,提问作者Noname
相关产品推荐
相关产品推荐

