题目描述:

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

示例 1:

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

示例 2:

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

示例 3:

输入:
"Aabb"
输出:
"bbAa"
解释:
此外,"bbaA"也是一个有效的答案,但"Aabb"是不正确的。
注意'A'和'a'被认为是两种不同的字符。
 
 解题思路:
用一个map来存每个字符出现的次数(键为字符,值为出现的次数),再将map中的entry按值来从大到小排序,然后再连接起来(根据map的值对应的key进行拼接)。
Map没有按值排序的方法,java有Comparator比较器接口,但要求的参数是list,我们可以通过Arraylist构造函数把map.entrySet()转化为list,就可以用比较器了。
Comparator比较器接口:

我们若需要控制某个类的次序,而该类本身不支持排序(即没有实现Comparable接口);我们可以建立一个“比较器”来进行排序。这个“比较器”只需要实现Comparator接口即可。
 
Collections.sort(list, new PriceComparator())
 
参数一:需要排序的list
参数二:比较器,实现Comparator接口的类,返回一个int型的值,就相当于一个标志,告诉sort方法按什么顺序来对list进行排序。
Comparator是个接口,可重写compare()及equals()这两个方法,用于比较功能;如果是null的话,就是使用元素的默认顺序,如a,b,c,d,e,f,g,就是a,b,c,d,e,f,g这样,当然数字也是这样的。
 
compare(a,b)方法:根据第一个参数小于、等于或大于第二个参数分别返回负整数、零或正整数。
equals(obj)方法:仅当指定的对象也是一个 Comparator,并且强行实施与此 Comparator 相同的排序时才返回 true
 
代码实现:

import java.util.*;

public class FrequencySort {
public static String frequencySort(String s) { if (s.length() < 3){
return s;
}      // 查找表(将数据存到一个表里,然后查找)map查找比list更优(更适合查找)
Map<Character, Integer> counter = new HashMap<>();
for (int i = 0; i < s.length(); i++) {
counter.put(s.charAt(i), counter.getOrDefault(s.charAt(i), 0) + 1);
}
    //通过Arraylist构造函数把map.entrySet()转化为list(map没有按值排序的方法,我们要把map转化为list)
List<Map.Entry<Character, Integer>> list = new ArrayList<>(counter.entrySet());
    //用Comparator比较器进行排序
Collections.sort(list, new Comparator<Map.Entry<Character, Integer>>() { @Override
public int compare(Map.Entry<Character, Integer> o1, Map.Entry<Character, Integer> o2) {
          //从大到小逆序排序
return o1.getValue() > o2.getValue() ? -1 : 1;
}
});
StringBuilder res = new StringBuilder();
     //遍历排好序的列表,得到排好序的集合,然后按值遍历,将键key放到res中,输出字符串)
for (Map.Entry<Character, Integer> entry : list) {
       //对每一个值进行遍历,例如a出现三次,遍历3次,将a加入res,e出现2词,遍历2次,将e加入res......
for (int i = 0; i < entry.getValue(); i++) {
res.append(entry.getKey());
}
}
return res.toString();
}
public static void main(String[] args){
String str = "traaaee";
System.out.print(frequencySort(str));
}
}

给定一个字符串,根据字符出现频率排序--Java实现的更多相关文章

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

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

  2. 给定一个字符串里面只有"R" "G" "B" 三个字符,请排序,最终结果的顺序是R在前 G中 B在后。 要求:空间复杂度是O(1),且只能遍历一次字符串。

    题目:给定一个字符串里面只有"R" "G" "B" 三个字符,请排序,最终结果的顺序是R在前 G中 B在后. 要求:空间复杂度是O(1),且 ...

  3. 核心API的使用(给定一个字符串,统计每个字符出现的次数)

    /** * 给定一个字符串,统计每个字符出现的次数. 如:abdaewrwqask435a1aasd */public class ReplaceString { static int length; ...

  4. 【leetcode-03】给定一个字符串,请你找出其中不含有重复字符的最长子串的长度

    开个新坑,leetcode上面做题目.下面是题目描述: <!-- 给定一个字符串,请你找出其中不含有重复字符的最长子串的长度. 示例 1: 输入: "abcabcbb" 输出 ...

  5. 给定一个字符串str,将str中连续两个字符为a的字符替换为b(一个或连续超过多个字符a则不替换)

    需求:给定一个字符串str,将str中连续两个字符为a的字符替换为b(一个或连续超过多个字符a则不替换) 如: a 不替换 b 不替换  ab 不替换 ba 不替换 aba 不替换  aab 替换为 ...

  6. 给定一个字符串,把字符串内的字母转换成该字母的下一个字母,a换成b,z换成a,Z换成A,如aBf转换成bCg, 字符串内的其他字符不改变,给定函数,编写函数 void Stringchang(const char*input,char*output)其中input是输入字符串,output是输出字符串

    import java.util.Scanner; /*** * 1. 给定一个字符串,把字符串内的字母转换成该字母的下一个字母,a换成b,z换成a,Z换成A,如aBf转换成bCg, 字符串内的其他字 ...

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

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

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

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

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

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

随机推荐

  1. 9.关联规则那不行fizi麸子

    1.关联规则概述 2.关联规则算法罗兵烙饼选择 3.关联规则的算法

  2. LC 465. Optimal Account Balancing 【lock,hard】

    A group of friends went on holiday and sometimes lent each other money. For example, Alice paid for ...

  3. net.sf.json.JSONObject处理 "null" 字符串的一些坑

    转: net.sf.json.JSONObject处理 "null" 字符串的一些坑 2018年05月02日 16:41:25 大白能 阅读数:7026   版权声明:本文为博主原 ...

  4. [Hibernate]知识点

    本笔记只介绍注解的方法 一.准备工作: a.添加三个pojo类: Product: package pojo; import javax.persistence.*; import java.util ...

  5. linux常用命令(11)less命令

    less 工具也是对文件或其它输出进行分页显示的工具,应该说是linux正统查看文件内容的工具,功能极其强大.less 的用法比起 more 更加的有弹性.在 more 的时候,我们并没有办法向前面翻 ...

  6. [iOS]UIWebView返回和NSURLErrorDomain-999

    1.UIWebView实现返回不崩溃: -(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)r ...

  7. mysql双主架构

    注意:最好不要用innodedb来同步数据库,要用databus来同步数据库,数据量大要用上mycat中间件 Mysql主主同步环境部署: centos 7.4 三台云主机: mysql1 :10.1 ...

  8. 事件冒泡 --- 仿select下拉框

    要求:点击按钮时,下拉框显示:点击页面其他部分时,下拉框消失: 1. 不靠谱代码 <!DOCTYPE html> <html> <head lang="en&q ...

  9. dependencies与devDependencies之间的区别

    dependencies:依赖 dev:develop(开发)的简写 1.--save-dev 和--save 的区别: 我们在使用npm install 安装模块或插件的时候,有两种命令把它们写入到 ...

  10. 在web项目中获取ApplicationContext上下文的3种主要方式及适用情况

    最近在做web项目,需要写一些工具方法,涉及到通过Java代码来获取spring中配置的bean,并对该bean进行操作的情形.而最关键的一步就是获取ApplicationContext,过程中纠结和 ...