Java如何实现按指定字符串字符次数移除库存字符串对应字符?
问题分析
原代码的核心问题在于使用了String.replace(char oldChar, char newChar),这个方法会替换字符串中所有匹配的oldChar,而非仅替换一次,导致只要input里出现某个字符,inventory里的该字符就会被全部清空,完全不符合“按input出现次数移除对应次数字符”的需求。另外后续处理空格的逻辑冗余且存在错误,多次调用replaceAll("\\s+","")完全没必要。
解决方案
要实现按input中字符的出现次数,从inventory里移除对应次数的字符,可以通过统计字符出现次数的方式处理,步骤如下:
- 统计input中每个字符的出现次数;
- 遍历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
相关产品推荐
相关产品推荐

