首页 > 试题广场 >

删除字符串中出现次数最少的字符

[编程题]删除字符串中出现次数最少的字符
  • 热度指数:398486 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
\hspace{15pt}对于给定的仅由小写字母构成的字符串,删除字符串中出现次数最少的字符。输出删除后的字符串,字符串中其它字符保持原来的顺序。
\hspace{15pt}特别地,若有多个字符出现的次数都最少,则把这些字符都删除。

输入描述:
\hspace{15pt}在一行上输入一个长度为 1 \leqq {\rm length}(s) \leqq 20 ,仅由小写字母构成的字符串 s ,代表待处理的字符串。


输出描述:
\hspace{15pt}在一行上输出一个字符串,代表删除后的答案。保证这个字符串至少包含一个字符。
示例1

输入

aabcddd

输出

aaddd

说明

\hspace{15pt}在这个样例中,出现次数最少的字符为 \texttt{`b'}\texttt{`c'} ,因此需要同时删除这两个字符。
import java.util.*;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        String s = in.nextLine();
        //1.map把字母和次数装在一起,
        Map<Character,Integer> map = new HashMap<>();
        for(char ch : s.toCharArray()){
            map.put(ch,map.getOrDefault(ch,0) + 1);
        }

        //2.记录最小的出现次数
        int min = Integer.MAX_VALUE;
        for(Integer value : map.values()){
            min = Math.min(value,min);
        }

        //3.遍历字符串,字符的出现次数不等于min,才能加入sb中
        StringBuilder sb = new StringBuilder();
        for(char ch : s.toCharArray()){
            if(!map.get(ch).equals(min)){
                sb.append(ch);
            }
        }
        System.out.println(sb.toString());
    }
}
发表于 2025-04-23 14:34:30 回复(0)
import java.util.*;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        //aabcddd
        Scanner in = new Scanner(System.in);
        //接受输入的字符串
        String str = in.nextLine();
        //result字符串sb
        StringBuilder sb = new StringBuilder();
        //map用来存不同字符的个数
        Map<Character, Integer> map = new HashMap<>();
        //遍历字符串,统计个数,存入map
        for (int i = 0; i < str.length(); i++) {
            char ch = str.charAt(i);
            if (map.containsKey(ch)) {
                Integer value = map.get(ch);
                value++;
                map.put(ch, value);
            } else {
                map.put(ch, 1);
            }
        }
        //map的keys
        Set<Character> keys = map.keySet();
        //根据keys的stream流收集keys的values到一个数组
        Integer[] values = keys.stream().map(map::get).toArray(Integer[]::new);
        //对values排序
        Integer temp = 0;
        for (int i = 0; i < values.length; i++) {
            for (int j = 0; j < values.length - i - 1; j++) {
                if (values[j] > values[j + 1]) {
                    temp = values[j];
                    values[j] = values[j + 1];
                    values[j + 1] = temp;
                }
            }
        }
        //需要删除的key的value值
        Integer delKeyValue = 0;
        if (values.length >= 2) {
            for (int i = 0; i < values.length - 1; i++) {
                if (values[i] != values[i + 1]) {
                    delKeyValue = values[i];
                    break;
                }
            }
        }
        //得到map的value为delKeyValue的key
        List<Character> delKeyList = new ArrayList<>();
        for (Character key : keys) {
            if (map.get(key) == delKeyValue) {
                //记录下来这个key,拼接的时候跳过这个key即可
                delKeyList.add(key);
            }
        }
        //拼接
        for (int i = 0; i < str.length(); i++) {
            if (delKeyList.contains(str.charAt(i))){
                continue;
            }else{
                sb.append(str.charAt(i));
            }
        }
        System.out.println(sb);
    }
}
发表于 2025-03-28 13:20:46 回复(1)
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Scanner;

public class Main {

    public static void main(String[] args) {

        Scanner scanner = new Scanner(System.in);

        String s = scanner.nextLine();

        int[] nums = new int[26];  //每个字母出现的次数

        HashSet<Integer> min_index = new HashSet<Integer>();  //记录最少出现次数的字母
        int min = 1; //最少出现的次数

        for (int i = 0; i < s.length(); i++) {
            int index = (s.charAt(i) - 'a');
            nums[index]++;

            //找到最少出现的字母
            if(nums[index]==1){
                if(min!=1){ //出现新的最少字母
                    min_index.clear();
                    min=1;
                }
                min_index.add(index);

            }else if(min_index.size()==1){
                if(min_index.contains(index)){ //最少出现次数的字母是当前的字母
                    min = nums[index];
                }
            }else { //当前字母已经不是最少出现的字母了
                if(min<nums[index]){
                    min_index.remove(index);
                }else{
                    min_index.add(index);
                }
            }
        }

        for (int i = 0; i < s.length(); i++) {
            int index = (s.charAt(i) - 'a');

            if(!min_index.contains(index))
                System.out.print(s.charAt(i));
        }

    }

}

发表于 2025-02-09 16:19:33 回复(0)
import java.util.*;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String input = in.nextLine();
        String result = reChars(input);

        System.out.println(result);
    }

    public static String reChars(String str) {
        // 使用HashMap来存储每个字符出现的次数
        Map<Character, Integer> charCountMap = new HashMap<>();
        for (char c : str.toCharArray()) {
            charCountMap.put(c, charCountMap.getOrDefault(c, 0) + 1);
        }

        // 找出出现次数最少的字符
        int minCount = Integer.MAX_VALUE;
        for (int count : charCountMap.values()) {
            if (count < minCount) {
                minCount = count;
            }
        }

        // 删除出现次数最少的字符
        StringBuilder result = new StringBuilder();
        for (char c : str.toCharArray()) {
            if (charCountMap.get(c) > minCount) {
                result.append(c);
            }
        }

        return result.toString();
    }
}

发表于 2024-10-18 16:36:55 回复(0)
import java.util.Scanner;
import java.util.*;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        while (in.hasNext()) { // 注意 while 处理多个 case
            char[] arr = in.nextLine().toCharArray();
            Map<Character, Integer> m = new HashMap<Character, Integer>();
            for (char a : arr) {
                if (m.keySet().contains(a)) {
                    m.put(a, m.get(a) + 1);
                } else {
                    m.put(a, 1);
                }
            }// m:{a=2, b=1, c=1, d=3}
            List<Integer> l = new ArrayList<Integer>(m.values());// 2 1 1 3
            Collections.sort(l);// 1 1 2 3
            int min = l.get(0);// 1
            Map<Character, Integer> n = new HashMap<Character, Integer>();
            for (Map.Entry<Character, Integer> entry : m.entrySet()) {
                if (min == entry.getValue()) {
                    n.put(entry.getKey(), entry.getValue());
                }
            }// n: {b=1, c=1}
            m.keySet().removeAll(n.keySet());// m: {a=2, d=3}
            StringBuilder s = new StringBuilder();
            for (char a : arr) {
                if (m.keySet().contains(a)) {
                    s.append(a);
                }
            }// s:aaddd
            System.out.println(s);
        }
    }
}
发表于 2024-09-10 16:23:18 回复(0)
import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String sc = in.nextLine();
        Map<Character,Integer> count = new HashMap<>();
        char[] ch = sc.toCharArray();
        StringBuilder newSc = new StringBuilder();
        //计数
        for( int i = 0; i < ch.length; i++)
        {
            if(count.containsKey(ch[i]))
            {
                count.put(ch[i],count.get(ch[i])+1);
            }
            else
            {
                count.put(ch[i],1);
            }
        }
        //找出最小次数min
        int min = 20;
        for(Integer t : count.values())
        {
            if(t<min)
            {
                min=t;
            }
        }
        //将所有出现次数为min的不显示
        for(int i = 0; i < ch.length; i++)
        {
            if(count.get(ch[i])!=min)
            {
                newSc.append(ch[i]);
            }
        }
        System.out.println(newSc.toString());
    }
}
发表于 2024-09-02 03:31:46 回复(0)
import java.util.*;
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String string = in.nextLine();
        Map<String, Integer> map = new HashMap<String, Integer>();
        for (String item : Arrays.asList(string.split(""))) {
            Integer s = map.get(item);
            if (s == null) {
                map.put(item, 1);
            } else {
                map.put(item, s + 1);
            }
        }
        Integer temp =null;
        for(String key:map.keySet()){
            if(temp == null){
                temp = map.get(key);
            }else{
                if(map.get(key) < temp){
                    temp = map.get(key);
                }
            }
        }
        for(String key:map.keySet()){
            if( map.get(key) == temp){
               string = string.replace(key,"");
            }
         
        }
        System.out.print(string);
    }
}
发表于 2024-07-15 20:58:12 回复(0)
为什么好多人都用map?用数组不是更简单吗?
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        while (in.hasNextLine()) {
            int[] ss = new int[26];
            String str = in.nextLine();
            for(int i=0;i<str.length();i++){
                ss[str.charAt(i)-'a']++;
            }
            int minCount = 21;
            for(int i=0;i<26;i++) {
                if(ss[i] > 0 && ss[i]< minCount) {
                    minCount = ss[i];
                }
            }
            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < str.length(); i++) {
                if(ss[str.charAt(i) - 'a'] != minCount) {
                    sb.append(str.charAt(i));
                }
            }
            System.out.println(sb);
        }
    }
}


发表于 2024-06-14 22:49:33 回复(0)
import java.util.HashMap;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        while (input.hasNext()) {
            String str = input.nextLine();
            HashMap<Character, Integer> count = new HashMap<>();
            for (char c : str.toCharArray()) {
                count.put(c, count.getOrDefault(c, 0) + 1);
            }
            //找出出现次数最少的字符的次数
            int min = Integer.MAX_VALUE;
            for (int num : count.values()) {
                min = Math.min(min, num);
            }
            //构建新的字符串,去掉出现次数最少的字符
            StringBuilder sb = new StringBuilder();
            for (char c : str.toCharArray()) {
                if (count.get(c) > min) {
                    sb.append(c);
                }
            }
            System.out.println(sb.toString());
        }
    }
}

发表于 2024-05-28 10:49:26 回复(0)
import java.util.HashMap;
import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String input = in.nextLine();
        HashMap<Character,Integer> map = new HashMap<>();
        
        for(int i=0;i<input.length();i++) {
            char tmp = input.charAt(i);
            if(map.containsKey(tmp)) {
                map.replace(tmp, map.get(tmp)+1);
            } else {
                map.put(tmp,1);
            }
        }

        int minValue = Integer.MAX_VALUE;
        for(Integer value:map.values()) {
            if(value<minValue) {
                minValue = value;
            }
        }

        for(int j=0;j<input.length();j++) {
            char tmp = input.charAt(j);
            if(map.get(tmp)!=minValue) {
                System.out.print(tmp);
            }
        }
    }
}

发表于 2024-04-30 10:14:07 回复(0)
import java.util.*;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String str = sc.nextLine();
        Map<Character, Integer> map = new HashMap<>();
        for (int i = 0; i < str.length(); i++) {
            if (map.containsKey(str.charAt(i))) {
                map.put(str.charAt(i), map.get(str.charAt(i)) + 1);
            } else {
                map.put(str.charAt(i), 1);
            }
        }
        int min = 20;
        for (Character ch : map.keySet()) {
            min = map.get(ch) < min ? map.get(ch) : min;
        }
        for (Character ch : map.keySet()) {
            if (map.get(ch) == min) {
                str = str.replace(String.valueOf(ch), "");
            }
        }
        System.out.println(str);
    }
}
发表于 2024-04-17 10:36:49 回复(0)
import java.util.*;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String str = sc.next();
        //统计所有字符的个数
        HashMap<Character, Integer> map = new HashMap();
        for (int i = 0; i < str.length(); i++) {
            char a = str.charAt(i);
            if (map.containsKey(a)) {
                int count = map.get(a);
                map.put(a, ++count);
            } else {
                map.put(a, 1);
            }
        }
        StringBuilder sb = new StringBuilder("");

        //找到最小值并删除
        int min = Collections.min(map.values());
        Iterator <Map.Entry<Character, Integer>>it = map.entrySet().iterator();
        while (it.hasNext()) {
            Map.Entry<Character, Integer> entry = it.next();
            if (entry.getValue() == min) {
                it.remove();
            }
        }
        //map里面存在的字符都是符合条件的,对比字符串,不断拼接符合条件爱你的字符
        for(int i =0;i<str.length();i++){
            if(map.containsKey(str.charAt(i))){
                sb.append(str.charAt(i));
            }
        }
        System.out.println(sb.toString());

    }
}

发表于 2024-04-10 15:32:42 回复(0)
import java.util.*;
import java.util.stream.Collectors;
public class Main {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        while (scan.hasNext()) {
            HashMap map = new HashMap();
            String s = scan.next();
            char[] chars = s.toCharArray();
            for (char c : chars) {
                if (map.containsKey(c)) {
                    map.put(c, map.get(c) + 1);
                } else {
                    map.put(c, 1);
                }
            }
            Integer less = map.entrySet().stream()
                            .sorted(Comparator.comparingInt(Map.Entry::getValue)).findFirst().get().getValue();
            //获取出现次数最少的字符
            List lessList = map.entrySet().stream()
                            .filter(e -> e.getValue() == less).map(Map.Entry::getKey).collect(Collectors.toList());
            StringBuilder sb = new StringBuilder();
            for (char nc : chars) {
                if (!lessList.contains(nc)) sb.append(nc);
            }
            System.out.println(sb);
        }
    }
}
发表于 2024-04-10 14:00:50 回复(0)
import java.util.*;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String str = in.next();
        Map<Character, Integer> map = new HashMap();
        char ch;
        for (int i = 0; i < str.length(); ++ i ) {
            ch = str.charAt(i);
            int t = map.getOrDefault(ch, 0);
            ++ t;
            map.put(ch, t);
        }
        Set<Character> set = map.keySet();
        int min = 21;
        for (Character c : set) {
            if (map.get(c) < min) min = map.get(c);
        }
        for (Character c : set) {
            if (map.get(c) == min) {
                str = str.replace(c + "", "");
            }
        }
        System.out.println(str);
    }
}

编辑于 2024-03-16 15:33:24 回复(0)
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String str = in.nextLine();
        Map<Character, Integer> map = new HashMap<>();
        for (char c: str.toCharArray()) {
        map.put(c, (map.getOrDefault(c, 0) + 1));
        }
       Collection<Integer> values = map.values(); 
       int min = Collections.min(values);
       for(Character c:map.keySet()){
        if(map.get(c) == min){
            str = str.replaceAll(String.valueOf(c),"");
        }
       }
       System.out.println(str);
    }
}

编辑于 2024-03-06 23:54:08 回复(0)
这个编译器不可以导入map包吗???
编辑于 2024-01-25 15:15:47 回复(0)
import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        while (in.hasNext()) { // 注意 while 处理多个 case
            String str = in.nextLine();
            //先记录每个字母出现的次数
            //由于是26个小写字母
            int[] count = new int[26];
            for (int i = 0; i < str.length(); i++) {
                //由于字母之间的ACSII值只相差1.可以通过遍历每个字母-a 得到数组的下标,每次遇到同一个下标说明是重复的字母  怎对应下标的值加1
                count[str.charAt(i) - 'a']++;
            }
            //接下来遍历数组判断最少的字母出现的次数,由于字符串长度小于等于20 所以定义一个最大的重复值为20
            int min = 20;
            for (int i = 0; i < count.length; i++) {
                //判断数组值不为0(为0表示未出现)并且值小于min 的,如果小于则将最小值更新为当前最小的值
                if (count[i] != 0 && count[i] < min) {
                    min = count[i];
                }
            }
            //接下来剔除最小的字母
            StringBuilder buff = new StringBuilder();
            for (int i = 0; i < str.length(); i++) {
                if (count[str.charAt(i) - 'a'] != min) {
                    buff.append(str.charAt(i));
                }
            }
            System.out.println(buff.toString());
        }
    }
}
发表于 2024-01-13 22:18:25 回复(0)
import java.util.*;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String line = in.nextLine();
Map<String, Integer> map = new HashMap<>();
char[] c = line.toCharArray();
String[] s = new String[20];
int min =Integer.MAX_VALUE;
for (int i = 0; i < c.length; i++) {
Integer a = map.get(c[i] + "");
if (a == null) {
map.put( c[i] + "", 1);
} else {
map.put( c[i] + "", a + 1);
}
}
Set<String> keyset = map.keySet();
Iterator<String> ite = keyset.iterator();
while (ite.hasNext()) {
String key = ite.next();
Integer value = map.get(key);
//判断最小值
if (value <= min) {
min=value;
if (s[value] != null && !"".equals(s[value])) {
String tmp = s[value] + "," + key;
s[value] = tmp;
} else {
s[value] = key;
}
}

}

for (int i = 0; i < s.length; i++) {
if (s[i] != null && !"".equals(s[i])) {
String[] g = s[i].split(",");
for (int j = 0; j < g.length; j++) {
line = line.replaceAll(g[j], "");
}
break;
}
}
System.out.print(line);
}

}
这个写的还是不够简洁;
下面是其他人的思路:真简单!!! 
先用map 统计每个字符出现的次数;
 然后对map的value collection做排序,找到最小的值;
keyset遍历map,匹配value是最小值的key,然后做replaceAll的替换;

发表于 2023-10-22 14:27:54 回复(0)
import java.util.Scanner;

import java.util.HashMap;
import java.util.Map;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {


    public static String removeLeastFrequentChars(String input) {
        if (input == null || input.isEmpty()) {
            return input;
        }

        // 使用哈希表来统计字符出现的次数
        Map<Character, Integer> charCount = new HashMap<>();
        for (char c : input.toCharArray()) {
            charCount.put(c, charCount.getOrDefault(c, 0) + 1);
        }

        // 找到最少出现次数
        int minCount = Integer.MAX_VALUE;
        for (int count : charCount.values()) {
            if (count < minCount) {
                minCount = count;
            }
        }

        // 构建结果字符串,删除出现次数最少的字符
        StringBuilder result = new StringBuilder();
        for (char c : input.toCharArray()) {
            if (charCount.get(c) != minCount) {
                result.append(c);
            }
        }

        return result.toString();
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String input =  sc.nextLine();
        String result = removeLeastFrequentChars(input);
        System.out.println(result);
    }
}


发表于 2023-10-10 20:14:27 回复(0)
import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        String str = in.nextLine();
        int size = str.length();
        int count = str.length();
        Set<String> set = new HashSet<>();
        for (int i = 0; i < str.length(); i++) {
            String s = str.charAt(i)+"";
            String st = str.replaceAll(s, "");
            if (count > (size-st.length())) {
                count = size-st.length();
                set.clear();
                set.add(s);
            }
            if (count == (size-st.length()) && !set.contains(s)) {
                set.add(s);
            }
        }
        if (!set.isEmpty()) {
            for (String s:set) {
                str = str.replace(s, "");
            }
        }
        System.out.println(str);
    }
}

发表于 2023-09-27 17:20:50 回复(0)