[LeetCode]Sort Characters By Frequency

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

Example 1:

Input:
"tree"

Output:
"eert"

Explanation:
'e' appears twice while 'r' and 't' both appear once.
So 'e' must appear before both 'r' and 't'. Therefore "eetr" is also a valid answer.

Example 2:

Input:
"cccaaa"

Output:
"cccaaa"

Explanation:
Both 'c' and 'a' appear three times, so "aaaccc" is also a valid answer.
Note that "cacaca" is incorrect, as the same characters must be together.

Example 3:

Input:
"Aabb"

Output:
"bbAa"

Explanation:
"bbaA" is also a valid answer, but "Aabb" is incorrect.
Note that 'A' and 'a' are treated as two different characters.

这道题一看是很简单,但是里面有很多点可以考察

解法:

1. 首先遍历String里的每一个字符,统计其个数,存在HashMap里。那么map的key,value类型即为 <Character, Integer> 

举例 如果是tree,那么map最后为

t-> 1

r-> 1

e-> 2

这里没有用TreeMap, 因为TreeMap虽然可以加一个Comparator,但是只能对Key进行排序,而不能对Value排序。根据题意,我们要基于字符出现的个数来输出字符串。所以普通的HashMap即可以。

2. 取出Map里的EntrySet,也就是一个Key-Value的集合,用它构建出来一个List

3. 用Collections.sort方法,把List排序,代码里v2-v1是因为我们需要大数在前。如果v1-v2则小的在前,大的在后。

现在list:

e->2

r->1

t->1

4. 对于list的每个item,StringBuilder append相应的个数

结果为eert

这里是java hashmap sort key,value的例子

public String frequencySort(String s) {
        if(s==null) return null;
        HashMap<Character,Integer> map=new HashMap<>();
        for(int i=0;i<s.length();i++){
            char c= s.charAt(i);
            int count=1;
            if(map.containsKey(c)){
                count=map.get(c)+1;
            }
            map.put(c,count);
        }
        List<Map.Entry<Character, Integer>> listOfEntries = new ArrayList<Map.Entry<Character, Integer>>(map.entrySet());

        Collections.sort(listOfEntries,new Comparator<Map.Entry<Character,Integer>>()
        { @Override public int compare(Map.Entry<Character,Integer> e1, Map.Entry<Character,Integer> e2)
        { int v1 = e1.getValue(); int v2 = e2.getValue(); return v2-v1; } });

        StringBuilder builder=new StringBuilder();
        for(Map.Entry<Character,Integer> pair :listOfEntries) {
            for (int i = 1; i <=pair.getValue(); i++) {
                builder.append(pair.getKey());
            }
        }
        return builder.toString();

    }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值