Leetcode刷题100天—451. 根据字符出现频率排序(优先队列)—day16

举报
神的孩子在歌唱 发表于 2021/09/30 18:08:47 2021/09/30
【摘要】 前言:作者:神的孩子在歌唱大家好,我叫运智给定一个字符串,请将字符串里的字符按照出现的频率降序排列。示例 1:输入:"tree"输出:"eert"解释:'e'出现两次,'r'和't'都只出现一次。因此'e'必须出现在'r'和't'之前。此外,"eetr"也是一个有效的答案。示例 2:输入:"cccaaa"输出:"cccaaa"解释:'c'和'a'都出现三次。此外,"aaaccc"也是有效的答...

前言:

作者:神的孩子在歌唱

大家好,我叫运智

image-20210823182940888

给定一个字符串,请将字符串里的字符按照出现的频率降序排列。

示例 1:

输入:
"tree"

输出:
"eert"

解释:
'e'出现两次,'r''t'都只出现一次。
因此'e'必须出现在'r''t'之前。此外,"eetr"也是一个有效的答案。

示例 2:

输入:
"cccaaa"

输出:
"cccaaa"

解释:
'c''a'都出现三次。此外,"aaaccc"也是有效的答案。
注意"cacaca"是不正确的,因为相同的字母必须放在一起。

示例 3:

输入:
"Aabb"

输出:
"bbAa"

解释:
此外,"bbaA"也是一个有效的答案,但"Aabb"是不正确的。
注意'A''a'被认为是两种不同的字符。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/sort-characters-by-frequency
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

package 优先队列;

import java.util.Comparator;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.PriorityQueue;

public class _451_根据字符出现频率排序 {
	public static String frequencySort(String s) {
//		设置返回的字符串
		String str="";
//		1. 通过哈希统计词频 2. 将value存入优先队列中进行排序 3. 最后遍历输出
		
		Map<Character, Integer> map=new HashMap<Character, Integer>();
		for(int i=0;i<s.length();i++) {
			System.out.println(s.charAt(i));
			map.put(s.charAt(i),map.getOrDefault(s.charAt(i), 0)+1);
		}
		System.out.println(map);//{r=1, t=1, e=2}
//		设置优先队列,由于题目要求降序,所以使用大顶堆
		PriorityQueue<str> queue=new PriorityQueue<>(new Comparator<str>() {
			public int compare(str o1,str o2) {
				return o2.getCount()-o1.getCount();//大顶堆
			}
		});
//		通过for循环将对应的值入队
		for(Map.Entry<Character, Integer> entry : map.entrySet()) {
			queue.offer(new str(entry.getKey(),entry.getValue()));
		}
		while(!queue.isEmpty()) {
			str+=queue.poll();
			System.out.println(str);
		}

		return str;
	}
//创建一个数据类Data,包含一个char类型的字符和int类型的次数
	public static class str{
		char c;
		int  num;
//		构造函数
		public str(char c ,int num) {
			// TODO 自动生成的构造函数存根
			this.c=c;
			this.num=num;
		}
		public char getC() {
			return this.c;
		}
		public int getCount() {
			return this.num;
		}
//		返回字符串
		public String toString() {
//			String str="";
			StringBuilder str = new StringBuilder();
			for (int i=0;i<num;i++) {
				str.append(c);
			}
			return str.toString();
		}
	}
	public static void main(String args[]) {
		String s="tree";
		String c=frequencySort(s);
	}
}

本人csdn博客:https://blog.csdn.net/weixin_46654114

转载说明:跟我说明,务必注明来源,附带本人博客连接。

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。