如何仅移除字符串中的大写重复字符
如何仅移除字符串中的大写重复字符
嘿,我来帮你捋清楚这个问题的解法~看起来你想要实现的是移除字符串里重复出现的大写字符,只留下那些仅出现一次的字符对吧?先看看你写的这段代码的逻辑:
你的核心思路是遍历字符串中的每个字符,判断这个字符在整个字符串里第一次出现的位置和最后一次出现的位置是否相同——如果相同,说明这个字符只出现了一次,就把它保留到结果里。比如你测试的"AskdaS",大写的S出现了两次,所以会被过滤掉,最终输出"Askda"。
如果这正是你想要的效果,那这段代码是能正常工作的,但有两个小地方可以优化一下,让它效率更高:
- 每次循环调用
indexOf()和lastIndexOf(),相当于每次都要把整个字符串扫一遍,字符串长了之后效率会有点低; - 用
String拼接结果,每次拼接都会创建新的字符串对象,不如用StringBuilder来拼接更高效。
这里给你一个优化后的版本,用哈希表先统计每个字符的出现次数,再筛选保留仅出现一次的字符:
public class Main { public static void main(String[] args) { String word = "AskdaS"; Polymers(word); } static void Polymers(String polymers) { // 先统计每个字符的出现次数 Map<Character, Integer> charCount = new HashMap<>(); for (char ch : polymers.toCharArray()) { charCount.put(ch, charCount.getOrDefault(ch, 0) + 1); } // 用StringBuilder构建结果,比String拼接更高效 StringBuilder result = new StringBuilder(); for (char ch : polymers.toCharArray()) { if (charCount.get(ch) == 1) { result.append(ch); } } System.out.println(result.toString()); } }
另外,我得确认下你的真实需求:如果你的目标是只针对大写字符去重(小写字符即使重复也保留),那上面的逻辑就不太对了——因为原代码和优化后的代码会把所有重复的字符(不管大小写)都移除。比如输入"AaBb",会输出空字符串,但如果你想保留小写的a、b,只移除重复的大写字符,那可以调整成下面这样:
public class Main { public static void main(String[] args) { String word = "AskdaSS"; Polymers(word); } static void Polymers(String polymers) { // 只统计大写字符的出现次数 Map<Character, Integer> upperCharCount = new HashMap<>(); for (char ch : polymers.toCharArray()) { if (Character.isUpperCase(ch)) { upperCharCount.put(ch, upperCharCount.getOrDefault(ch, 0) + 1); } } StringBuilder result = new StringBuilder(); for (char ch : polymers.toCharArray()) { if (Character.isUpperCase(ch)) { // 大写字符仅当出现一次时才保留 if (upperCharCount.get(ch) == 1) { result.append(ch); } } else { // 小写字符全部保留,不管是否重复 result.append(ch); } } System.out.println(result.toString()); } }
这个版本里,小写字符不管重复多少次都会保留,只有重复的大写字符会被移除。比如输入"AskdaSS",大写S出现3次,会被过滤,最终输出"Askda";如果输入"AABb",大写A重复,会被移除,输出"Bb"。
备注:内容来源于stack exchange,提问作者Adelino So
相关产品推荐
相关产品推荐

