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

题目描述

实现删除字符串中出现次数最少的字符,若多个字符出现次数一样,则都删除。
输出删除这些单词后的字符串,字符串中其它字符保持原来的顺序。

输入描述:

字符串只包含小写英文字母, 不考虑非法输入,输入的字符串长度小于等于20个字节。

输出描述:

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

输入例子:

abcdd

输出例子:

dd
public String[] delMinFrequencyChar(String[] input) {
        int n = input.length;
        String[] res = new String[n];
        for (int i = 0; i < n; i++) {
            String s = input[i];
            char[] chs = s.toCharArray();

            Map<Character, Integer> map = new HashMap<>();
            for (char c : chs) {
                map.put(c, map.getOrDefault(c, 0) + 1);
            }
            List<Map.Entry<Character, Integer>> list = new ArrayList<>(map.entrySet());
            list.sort(Comparator.comparingInt(Map.Entry::getValue));
            Set<Character> removeChar = new HashSet<>();
            int min = list.get(0).getValue();
            removeChar.add(list.get(0).getKey());
            for (int j = 1; j < list.size(); j++) {
                if (list.get(j).getValue() == min) {
                    removeChar.add(list.get(j).getKey());
                } else {
                    break;
                }
            }
            StringBuilder sb = new StringBuilder();
            for (char c : chs) {
                if (!removeChar.contains(c)) {
                    sb.append(c);
                }
            }
            res[i] = sb.toString();
        }
        return res;
    }
import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        scanner.nextLine(); // 去掉回车符
        for (int i = 0; i < n; i++) {
            String s = scanner.nextLine();
            char[] chs = s.toCharArray();

            Map<Character, Integer> map = new HashMap<>();
            for (char c : chs) {
                map.put(c, map.getOrDefault(c, 0) + 1);
            }
            List<Map.Entry<Character, Integer>> list = new ArrayList<>(map.entrySet());
            list.sort(Comparator.comparingInt(Map.Entry::getValue));
            Set<Character> removeChar = new HashSet<>();
            int min = list.get(0).getValue();
            removeChar.add(list.get(0).getKey());
            for (int j = 1; j < list.size(); j++) {
                if (list.get(j).getValue() == min) {
                    removeChar.add(list.get(j).getKey());
                } else {
                    break;
                }
            }
            StringBuilder sb = new StringBuilder();
            for (char c : chs) {
                if (!removeChar.contains(c)) {
                    sb.append(c);
                }
            }
            System.out.println(sb);
        }
    }
}

一种新的编程思想:
1、将26个字母转换成1-26个数字来存储,来比较;
2、数组新用法:用数组索引来代表具体的数字,用具体索引锁存的数字来代表出现的次数

import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while(sc.hasNextLine()) {
            String str = sc.nextLine();
            int[] num = new int[26];//将字符转换为数字,存放在数组中
            for(int i=0; i<str.length(); i++) {
                char ch = str.charAt(i);
                int n = (int)(ch - 'a');
                num[n] ++;
            }
            int min = Integer.MAX_VALUE;//当不知有多少重复次数时的固定操作
            for(int i=0; i<26; i++) {
                if(num[i] != 0 && num[i] < min) {
                    min = num[i];
                }
            }
            for(int i=0; i<str.length(); i++) {
                char ch = str.charAt(i);
                int n = (int)(ch - 'a');
                if(num[n] != min) {
                    System.out.print(ch);
                }
            }
            System.out.println();//平台本身问题,需要输出这一句
        }
    }
}


import java.util.*;
public class Main{
    public static void main(String[]args){
        Scanner scan=new Scanner(System.in);
        while(scan.hasNextLine()){
            String str=scan.nextLine();
            int []max=new int[26];
            char[]ch=str.toCharArray();
            int min=Integer.MAX_VALUE;
            for(int i=0;i<ch.length;i++){
                max[ch[i]-'a']++;
                min=min>max[ch[i]-'a']?max[ch[i]-'a']:min;
            }
            
             
            for(int i=0;i<max.length;i++){
                  if(max[i]==min){
            
                    str=str.replaceAll(String.valueOf((char)(i+97)), "");
                }
            }
                System.out.println(str);
            }
    }
}
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)
        {//abcdabcddd
            StringBuilder res = new StringBuilder(256);
            Scanner sc = new Scanner(System.in);
            String input = sc.nextLine();


            HashMap<Character, Integer> map = new HashMap<Character, Integer>();
            //count character times
            char[] chs = input.toCharArray();
            for (char c : chs) {
                map.put(c, map.getOrDefault(c, 0) + 1);
            }

            int min = Collections.min(map.values());
            //delete
            for (char ch : chs) {
                if (min != map.get(ch))
                    res.append(ch);
            }


            System.out.println(res.toString());

        }
}
import java.util.*;
public class Main{
    public static void main(String[]args){
        Scanner scan=new Scanner(System.in);
        while(scan.hasNextLine()){
            String str=scan.nextLine();
            if(str.length()>20){
                continue;
            }
            int []max=new int[26];
            char[]ch=str.toCharArray();
            int min=Integer.MAX_VALUE;
            for(int i=0;i<ch.length;i++){
                max[ch[i]-'a']++;
                min=min>max[ch[i]-'a']?max[ch[i]-'a']:min;
            }
            
             
            for(int i=0;i<max.length;i++){
                  if(max[i]==min){
                      
                    str=str.replaceAll(String.valueOf((char)(i+97)), "");
                }
            }
                System.out.println(str);
            }
    }
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值