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

实现replaceRepeating方法:将字符串重复字符替换为指定字符

实现 replaceRepeating 方法的解决方案

嘿,我来帮你搞定这个replaceRepeating方法的实现。需求很明确:把输入字符串里所有重复出现的字符(也就是在整个字符串中出现次数≥2的字符),全部替换成指定的字符。下面我会一步步拆解思路,给出几种不同场景的代码实现。

核心思路拆解

要完成这个功能,其实就两步:

  • 第一步:先统计字符串里每个字符的出现频率,搞清楚哪些是重复字符。
  • 第二步:遍历原字符串,遇到重复字符就替换成目标字符,非重复的就原样保留。

代码实现(Java版本)

基础版:严格区分大小写,替换所有重复字符

这个版本会把所有出现次数超过1的字符,不管大小写,全部替换掉:

public class StringUtils {
    public static String replaceRepeating(String input, char replacement) {
        // 用数组统计ASCII字符出现次数,效率比HashMap高;支持Unicode的话换成HashMap<Character, Integer>
        int[] charFrequency = new int[256];
        for (char c : input.toCharArray()) {
            charFrequency[c]++;
        }

        StringBuilder result = new StringBuilder();
        for (char c : input.toCharArray()) {
            // 只要出现次数>1,就替换
            if (charFrequency[c] > 1) {
                result.append(replacement);
            } else {
                result.append(c);
            }
        }

        return result.toString();
    }

    // 测试一下
    public static void main(String[] args) {
        String testInput = "Krishnan Aravind";
        char replaceChar = '*';
        System.out.println(replaceRepeating(testInput, replaceChar));
        // 输出:K**sh*** A**v**d
    }
}

保留首次出现版:仅替换重复的后续实例

如果你的需求是第一次出现的重复字符保留,之后出现的才替换(比如原字符串里的第一个r保留,第二个r替换),可以用这个版本:

public static String replaceRepeatingKeepFirst(String input, char replacement) {
    Set<Character> seenChars = new HashSet<>();
    Set<Character> repeatedChars = new HashSet<>();

    // 先标记出哪些是重复字符
    for (char c : input.toCharArray()) {
        if (!seenChars.add(c)) {
            repeatedChars.add(c);
        }
    }

    StringBuilder result = new StringBuilder();
    Set<Character> firstOccurrence = new HashSet<>();
    for (char c : input.toCharArray()) {
        if (repeatedChars.contains(c)) {
            if (firstOccurrence.add(c)) {
                // 首次出现,保留原字符
                result.append(c);
            } else {
                // 后续重复,替换
                result.append(replacement);
            }
        } else {
            // 非重复字符,直接保留
            result.append(c);
        }
    }

    return result.toString();
}

测试这个方法的话,输入"Krishnan Aravind"会得到Krishna* Ar*v**d。

忽略大小写版:大小写视为同一字符

如果需要把A和a这类大小写字符视为重复,可以用这个版本:

public static String replaceRepeatingIgnoreCase(String input, char replacement) {
    Map<Character, Integer> lowerCaseFreq = new HashMap<>();

    // 统一转小写统计频率,忽略大小写
    for (char c : input.toLowerCase().toCharArray()) {
        lowerCaseFreq.put(c, lowerCaseFreq.getOrDefault(c, 0) + 1);
    }

    StringBuilder result = new StringBuilder();
    for (char c : input.toCharArray()) {
        char lowerC = Character.toLowerCase(c);
        if (lowerCaseFreq.get(lowerC) > 1) {
            result.append(replacement);
        } else {
            result.append(c);
        }
    }

    return result.toString();
}

关于示例输出的说明

你提到的示例调用replaceRepeating("Krishnan Aravind", '*')输出K sh*v*d,这个结果和上面的实现不太匹配,可能是示例描述有小误差(比如是不是只替换连续重复的字符?但你明确说r、i、n、a都被替换,显然不是连续)。不过没关系,你可以根据实际的业务需求,从上面的几个版本里选,或者调整判定逻辑就行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 19:12:47