题解 | #删除字符串中出现次数最少的字符#

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

https://www.nowcoder.com/practice/05182d328eb848dda7fdd5e029a56da9

import java.util.*;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public String deleteLeast(String str)
    {
	  //键值对分别代表字符及其出现的次数
        Map<Character,Integer> map=new HashMap<>();
	  //记录需要被删除的字符
        Set<Character> set=new HashSet<>(); 
        for (int i=0;i<str.length();i++)
        {
            char temp=str.charAt(i);
            map.put(temp,map.getOrDefault(temp,0)+1);
        }
	  //将Entry对象根据其出现次数进行比较构造一个小顶堆
        PriorityQueue<Map.Entry<Character,Integer>> priorityQueue=new PriorityQueue<>((o1,o2)->{
            return o1.getValue()-o2.getValue();
        });
        for (Map.Entry<Character,Integer> entry:map.entrySet())
        {
            priorityQueue.offer(entry);
        }
	  //找到小顶堆中最小出现次数及其字符将其添加到哈希表中
        Map.Entry<Character,Integer> leastentry=priorityQueue.poll();
        set.add(leastentry.getKey());
        int minTimes=leastentry.getValue();
	  //遍历小顶堆,如果其出现次数和最小相同,则将其添加到hashSet中
        while (!priorityQueue.isEmpty())
        {
            if (priorityQueue.peek().getValue()==minTimes)
            {
                set.add(priorityQueue.peek().getKey());
                priorityQueue.poll();   
            }else break;
        }
	  //通过stringBuilder对象添加不需要被删除的字符并返回结果
        StringBuilder sb=new StringBuilder();
        for (int i=0;i<str.length();i++)
        {
            char temp=str.charAt(i);
            if (!set.contains(temp))
            {
                sb.append(temp);
            }
        }
        return sb.toString();
    }
    public static void main(String[] args) {
        Main main=new Main();
        Scanner in = new Scanner(System.in);
        while (in.hasNext()) {
            String a = in.next();
            String res=main.deleteLeast(a);
            System.out.println(res);
        }
    }
}

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务