力扣451(java)-根据字符出现频率排序(中等)
题目:
给定一个字符串 s ,根据字符出现的 频率 对其进行 降序排序 。一个字符出现的 频率 是它出现在字符串中的次数。
返回 已排序的字符串 。如果有多个答案,返回其中任何一个。
示例 1:
输入: s = "tree"
输出: "eert"
解释: 'e'出现两次,'r'和't'都只出现一次。
因此'e'必须出现在'r'和't'之前。此外,"eetr"也是一个有效的答案。
示例 2:
输入: s = "cccaaa"
输出: "cccaaa"
解释: 'c'和'a'都出现三次。此外,"aaaccc"也是有效的答案。
注意"cacaca"是不正确的,因为相同的字母必须放在一起。
示例 3:
输入: s = "Aabb"
输出: "bbAa"
解释: 此外,"bbaA"也是一个有效的答案,但"Aabb"是不正确的。
注意'A'和'a'被认为是两种不同的字符。
提示:
1 <= s.length <= 5 * 105
s 由大小写英文字母和数字组成
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/sort-characters-by-frequency
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路:
1.首先判断特殊情况,字符串为空的情况,就返回s;
2.根据s构建HashMap,键key为s中的每个字母,值value为对应字母出现的次数;
3.填充map,遍历s,如果当前key存在,就返回对应的value+1,不存在就返回默认值 +1;
4.构造一个桶的集合buckets,桶的长度为s.length()+1,目的是为了让出现i次的字符放在对应的第i个桶里;
5.遍历map中的所有key(字符),获取当前字符的次数value,如果某个桶还未放入过字符,则将其初始化为一个字符数组,然后将key存放进对应的buckets[value];
6.最后从桶的最后往前遍历,如果桶里有字符,则遍历桶里的每个字符,字符出现几次就向结果数组里添加几次该字符,最后将数组转换成字符串进行返回。
代码:
1 class Solution {
2 public String frequencySort(String s) {
3 if(s.length() == 0 || s == null){
4 return s;
5 }
6 Map<Character, Integer> map = new HashMap<Character, Integer>();
7 for(int i = 0; i < s.length(); i++){
8 char c = s.charAt(i);
9 map.put(c, map.getOrDefault(c,0) + 1);
10 }
11 List<Character>[] buckets = new List[s.length() + 1];
12 for(char key : map.keySet()){
13 //将当前字符的次数赋值给value
14 int value = map.get(key);
15 //如果当前某个桶里还没有字符,则对其进行初始化
16 if(buckets[value] == null){
17 buckets[value] = new ArrayList<Character>();
18 }
19 //将字符放进桶里
20 buckets[value].add(key);
21 }
22 StringBuffer res = new StringBuffer();
23 for(int i = buckets.length-1; i > 0 ; i--){
24 if(buckets[i] != null){
25 for(char c : buckets[i]){
26 for(int j = i; j > 0; j--){
27 res.append(c);
28 }
29 }
30 }
31 }
32 return res.toString();
33 }
34 }
小知识:
1.Java不能创建泛型类型的数组
List<Character>[] buckets = new List[s.length() + 1];
不能写成:
List<Character>[] buckets = new List<Character>[s.length() + 1];
2.map.keySet(): 获取map中所有的key值
3.Stringbuffer是动态字符串数组,append()是往动态字符串数组添加,如"x”+"y"相当那个+号,跟String不同的是stringbuffer是放一起的String1+String2,
例如:
StringBuffer s = new StringBuffer("Hello" ) ;
s.append("world");
则s的内容是Helloworld。
力扣451(java)-根据字符出现频率排序(中等)的更多相关文章
- Java实现 LeetCode 451 根据字符出现频率排序
451. 根据字符出现频率排序 给定一个字符串,请将字符串里的字符按照出现的频率降序排列. 示例 1: 输入: "tree" 输出: "eert" 解释: 'e ...
- Leetcode 451.根据字符出现频率排序
根据字符出现频率排序 给定一个字符串,请将字符串里的字符按照出现的频率降序排列. 示例 1: 输入: "tree" 输出: "eert" 解释: 'e'出现两次 ...
- leetcode.排序.451根据字符出现频率排序-Java
1. 具体题目 给定一个字符串,请将字符串里的字符按照出现的频率降序排列. 示例 1: 输入: "tree" 输出: "eert" 解释: 'e'出现两次,'r ...
- [LeetCode] 451. Sort Characters By Frequency 根据字符出现频率排序
Given a string, sort it in decreasing order based on the frequency of characters. Example 1: Input: ...
- 给定一个字符串,根据字符出现频率排序--Java实现
题目描述: 给定一个字符串,请将字符串里的字符按照出现的频率降序排列. 示例 1: 输入:"tree" 输出:"eert" 解释:'e'出现两次,'r'和't' ...
- 451 Sort Characters By Frequency 根据字符出现频率排序
给定一个字符串,请将字符串里的字符按照出现的频率降序排列.示例 1:输入:"tree"输出:"eert"解释:'e'出现两次,'r'和't'都只出现一次.因此' ...
- LeetCode 451. Sort Characters By Frequency (根据字符出现频率排序)
Given a string, sort it in decreasing order based on the frequency of characters. Example 1: Input: ...
- 【LeetCode】451-根据字符出现频率排序
题目描述 给定一个字符串,请将字符串里的字符按照出现的频率降序排列. 示例 1: 输入: "tree" 输出: "eert" 解释: 'e'出现两次,'r'和' ...
- [LeetCode] Sort Characters By Frequency 根据字符出现频率排序
Given a string, sort it in decreasing order based on the frequency of characters. Example 1: Input: ...
- [Swift]LeetCode451. 根据字符出现频率排序 | Sort Characters By Frequency
Given a string, sort it in decreasing order based on the frequency of characters. Example 1: Input: ...
随机推荐
- 【机器学习】统计学习方法读书笔记-EM算法(期望最大化算法)
Expectation Maximization,EM算法是带有隐变量的概率模型参数的极大似然估计(MLE为给定参数,观测数据出现/生成的可能性). 如下为<统计机器学习>中对应EM算法的 ...
- 使用docker-compose管理freeswitch容器
概述 之前的文章我们介绍过如何将freeswitch做成docker镜像,也使用命令行模式正常启动了fs的docker容器. 但是当我们需要同时管理多个docker容器的时候,还是使用docker-c ...
- 剖析云流送技术如何为3D应用带来用户使用便利
在过去的十年中,云游戏技术的发展为云计算行业带来了新的机遇.随着Google Stadia和GeForce Now之类的服务逐步向公众开放,云流送(cloud streaming)技术得到更大范围的应 ...
- 使用Go语言开发一个短链接服务:一、基本原理
章节 使用Go语言开发一个短链接服务:一.基本原理 使用Go语言开发一个短链接服务:二.架构设计 使用Go语言开发一个短链接服务:三.项目目录结构设计 使用Go语言开发一个短链接服务:四.生成 ...
- verilog设计知识集合(2)
verilog设计知识集合(2) 1.阻塞与非阻塞 阻塞赋值是存在先后关系的,非阻塞是不存在先后关系的.一般而言,阻塞用于组合逻辑,非阻塞用于时序逻辑(不一定).阻塞的执行时逐步赋值,非阻塞是同步赋值 ...
- KingabseES执行计划-分区剪枝(partition pruning)
概述 分区修剪(Partition Pruning)是分区表性能的查询优化技术 .在分区修剪中,优化器分析SQL语句中的FROM和WHERE子句,以在构建分区访问列表时消除不需要的分区.此功能使数据库 ...
- FineReport 常用日期公式
获取当前月份最后一天 DATEINMONTH(today(), -1) 获取当前月份第一天 DATEINMONTH(today(), 1) 获取上个月最后一天 DATEINMONTH(MONTHDEL ...
- RSA进阶(一)
本篇为RSA进阶篇,继RSA入门 [RSA3]P1(扩展欧几里得) 题目 from Crypto.Util.number import * flag = b'******' m1 = bytes_to ...
- Spring Bean 的一生
Spring Bean 的一生包括其从创建到消亡的整个过程: 实例创建 => 填充 => 初始化 => 使用 => 销毁. 这里需要注意的是,从 bean 实例的创建到可以使用 ...
- OpenHarmony中的HDF单链表及其迭代器
概念 为了性能考虑,嵌入式系统一般使用C语言进行开发,由于C语言标准库没有封装链表,所以嵌入式系统一般自己设计和实现链表这种数据结构.单链表是链表中的一种,本文描述OpenAtom OpenHarmo ...