题目:

给定一个字符串 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)-根据字符出现频率排序(中等)的更多相关文章

  1. Java实现 LeetCode 451 根据字符出现频率排序

    451. 根据字符出现频率排序 给定一个字符串,请将字符串里的字符按照出现的频率降序排列. 示例 1: 输入: "tree" 输出: "eert" 解释: 'e ...

  2. Leetcode 451.根据字符出现频率排序

    根据字符出现频率排序 给定一个字符串,请将字符串里的字符按照出现的频率降序排列. 示例 1: 输入: "tree" 输出: "eert" 解释: 'e'出现两次 ...

  3. leetcode.排序.451根据字符出现频率排序-Java

    1. 具体题目 给定一个字符串,请将字符串里的字符按照出现的频率降序排列. 示例 1: 输入: "tree" 输出: "eert" 解释: 'e'出现两次,'r ...

  4. [LeetCode] 451. Sort Characters By Frequency 根据字符出现频率排序

    Given a string, sort it in decreasing order based on the frequency of characters. Example 1: Input: ...

  5. 给定一个字符串,根据字符出现频率排序--Java实现

    题目描述: 给定一个字符串,请将字符串里的字符按照出现的频率降序排列. 示例 1: 输入:"tree" 输出:"eert" 解释:'e'出现两次,'r'和't' ...

  6. 451 Sort Characters By Frequency 根据字符出现频率排序

    给定一个字符串,请将字符串里的字符按照出现的频率降序排列.示例 1:输入:"tree"输出:"eert"解释:'e'出现两次,'r'和't'都只出现一次.因此' ...

  7. LeetCode 451. Sort Characters By Frequency (根据字符出现频率排序)

    Given a string, sort it in decreasing order based on the frequency of characters. Example 1: Input: ...

  8. 【LeetCode】451-根据字符出现频率排序

    题目描述 给定一个字符串,请将字符串里的字符按照出现的频率降序排列. 示例 1: 输入: "tree" 输出: "eert" 解释: 'e'出现两次,'r'和' ...

  9. [LeetCode] Sort Characters By Frequency 根据字符出现频率排序

    Given a string, sort it in decreasing order based on the frequency of characters. Example 1: Input: ...

  10. [Swift]LeetCode451. 根据字符出现频率排序 | Sort Characters By Frequency

    Given a string, sort it in decreasing order based on the frequency of characters. Example 1: Input: ...

随机推荐

  1. 基于Python的子进程获取键盘输入

    一 概念 众所周知,python中的获取键盘输入,input函数是没办法用在子程序的,这就限制了它的用途.想要在子程序中获取键盘输入.唯有 fn=sys.stdin.fileno函数了. 二 实例解析 ...

  2. 华为sound x智能音箱初体验

    外观颜值   在这个网红遍地的年代,好看的皮囊是那么的重要.很多东西,买与不买,只是你在电脑的橱上看它一眼.颜值对一个消费电子产品来说,在这个虚拟的互联网世界中是那么的重要.sound x的初次看来, ...

  3. AOSP源码编译—交换空间扩容

    编译AOSP源码的时候会出现提示如下: 意思是需要16G左右的内存(实际上编译会超过16G),而我们之前安装Ubuntu的时候只分配了8G,编 译一定会失败!此时需要添加虚拟内存(swap交换空间) ...

  4. 记录--基于css3写出的流光登录(注释超详细!)

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 完整效果 对基本的表单样式进行设置 这里设置了基本的表单样式,外层用了div进行包裹,重点是运用了两个i元素在后期通过css样式勾画出一条 ...

  5. 开发必会系列:JavaEE持久层框架对比与hibernate主键生成策略总结

    一.持久层框架对比 ORM框架:即对象关系映射.它把数据库表映射到pojo类,然后通过对类的操作来实现对数据库的增删改查,sql语句自动生成. 对于代码开发者来说,就是在代码里先创建数据库连接对象,然 ...

  6. SpringBoot项目 填充Excel模板 导出 下载

    模板 下载后的效果 项目结构 pom <?xml version="1.0" encoding="UTF-8"?> <project xmln ...

  7. 前端 Typescript 入门

    前端 Typescript 入门 Ant design vue4.x 基于 vue3,示例默认是 TypeScript.比如 table 组件管理. vue3 官网介绍也使用了 TypeScript, ...

  8. Android按钮_单选框_多选框_文字框

    1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout xmlns:android= ...

  9. Android弹出UI界面---Toast

    1.默认展示 1 // 第一个参数:当前的上下文环境.可用getApplicationContext()或this 2 // 第二个参数:要显示的字符串.也可是R.string中字符串ID 3 // ...

  10. 第一个hello驱动

    Linux驱动程序的分类 字符设备驱动.块设备驱动和网络设备驱动. Linux驱动程序运行方式 把驱动程序编译进内核里面,这样内核启动后就会自动运行驱动程序了: 把驱动程序编译成以.ko为后缀的模块文 ...