【leetcode】【Medium】【451. Sort Characters By Frequency】【HashMap】【PriorityQueue】【HeapSort】

本文介绍了一种使用Java的PriorityQueue和HashMap实现的频率排序算法,通过优先队列按字符出现频率进行降序排序,适用于LeetCode上的相关题目。文中详细解释了如何利用优先队列进行高效排序,并给出了具体代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

problem link: https://leetcode.com/problems/sort-characters-by-frequency/


note:

1.Java集合类priorityqueue优先队列,没用过所以想不到,还想自己写插入排序,Java现成的方法很方便

2.想到用桶排序的思想,但是由于考虑到string长度会不会太长以及中文字符的存在而放弃了

3.compare方法排序默认是升序

int compare(Object o1, Object o2) 返回一个基本类型的整型
如果要按照升序排序,
则o1 小于o2,返回-1(负数),相等返回0,01大于02返回1(正数)
如果要按照降序排序
 则o1 小于o2,返回1(正数),相等返回0,01大于02返回-1(负数)



code:

1.(Java beat 34.76%)  集合priority  queue  ,hashmap

public class Solution {
    public String frequencySort(String s) {
        if(s.length()<3)
            return s;
            
		HashMap<Character, Integer> charMap = new HashMap<Character, Integer>();
		for (char c : s.toCharArray()) {
			if (charMap.containsKey(c)) {
				charMap.put(c, (charMap.get(c) + 1));
			} else {
				charMap.put(c, 1);
			}
		}

		PriorityQueue<Map.Entry<Character, Integer>> priorityQueue = new PriorityQueue<Map.Entry<Character, Integer>>(
				new Comparator<Map.Entry<Character, Integer>>() {
					@Override
					public int compare(Map.Entry<Character, Integer> e1, Map.Entry<Character, Integer> e2) {
						return e2.getValue() - e1.getValue();// 降序排列
					}
				});

		priorityQueue.addAll(charMap.entrySet());

		StringBuilder res = new StringBuilder();
		// while (priorityQueue.size() > 0) {
		while (!priorityQueue.isEmpty()) {
			Map.Entry<Character, Integer> entry = priorityQueue.poll();
			// poll方法和remove方法不同是remove会在优先队列是空的时候抛出异常,poll会返回null
			for (int i = 0; i < entry.getValue(); i++) {
				res.append(entry.getKey());
			}
		}

		return res.toString();
    }
}

2.桶排序

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值