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

Java如何实现按指定字符串字符次数移除库存字符串对应字符?

问题分析

原代码的核心问题在于使用了String.replace(char oldChar, char newChar),这个方法会替换字符串中所有匹配的oldChar,而非仅替换一次,导致只要input里出现某个字符,inventory里的该字符就会被全部清空,完全不符合“按input出现次数移除对应次数字符”的需求。另外后续处理空格的逻辑冗余且存在错误,多次调用replaceAll("\\s+","")完全没必要。

解决方案

要实现按input中字符的出现次数,从inventory里移除对应次数的字符,可以通过统计字符出现次数的方式处理,步骤如下:

  1. 统计input中每个字符的出现次数;
  2. 遍历inventory的每一个字符:
    • 如果该字符在统计计数中还有剩余次数,就跳过这个字符(相当于移除一次),同时将计数减1;
    • 如果计数已为0或者不在统计范围内,就将该字符保留到结果里。
代码实现
public static String removeFromInventory(String input, String inventory) {
    // 用数组统计字符出现次数,char的取值范围是0-65535,足够覆盖所有常规字符
    int[] charCount = new int[65536];
    for (int i = 0; i < input.length(); i++) {
        char c = input.charAt(i);
        charCount[c]++;
    }

    StringBuilder result = new StringBuilder();
    for (int i = 0; i < inventory.length(); i++) {
        char c = inventory.charAt(i);
        if (charCount[c] > 0) {
            charCount[c]--;
        } else {
            result.append(c);
        }
    }

    return result.toString();
}
代码说明
  • 用int[]统计字符次数比HashMap更高效,因为char的取值范围是固定的0到65535;
  • 使用StringBuilder拼接结果,避免频繁创建字符串对象,提升性能;
  • 遍历inventory时,每遇到一个需要移除的字符(计数>0),就将计数减1,仅移除一次,完全匹配需求。

测试你的案例:input为"11+",inventory为"111234++",统计得到'1'的计数是2,'+'的计数是1。遍历inventory时:

  • 前两个'1'会被跳过(计数分别减到1、0),第三个'1'因计数为0被保留;
  • 第一个'+'被跳过(计数减到0),第二个'+'被保留;
  • 其他字符直接保留,最终得到结果"11234+",完全符合预期。

内容的提问来源于stack exchange,提问作者Noname

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 23:35:29