实现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
相关产品推荐
相关产品推荐

