You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从字符串中移除指定字符的对应次数出现?

按字符出现次数精准移除对应字符的解决方案

你的代码问题出在使用了replace(char, char)——这个方法会一次性替换字符串中所有匹配的字符,完全没考虑表达式里每个字符的出现次数,而且嵌套循环的逻辑会重复触发全替换,自然达不到只移除对应次数的效果。

正确实现思路

要实现精准移除对应次数的字符,核心是先统计表达式中每个字符的需求次数,再遍历输入字符串逐个判断是否保留:

  1. 统计表达式中每个字符的出现次数
  2. 遍历输入字符串的每个字符:
    • 如果该字符还有需要移除的剩余次数,跳过它并减少剩余次数
    • 否则保留该字符
  3. 拼接保留的字符得到结果

实现代码

// 辅助方法:统计字符串中每个字符的出现次数
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 01:05:18