LeetCode 451. Sort Characters By Frequency

来源:互联网 发布:兼职在家做数据录入 编辑:程序博客网 时间:2024/04/30 09:54

原题网址:https://leetcode.com/problems/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.

方法:桶排序

public class Solution {    private int[] frequency(char[] sa) {        int[] counts = new int[256];        for(int i = 0; i < sa.length; i++) {            counts[sa[i]]++;        }        return counts;    }    public String frequencySort(String s) {        char[] sa = s.toCharArray();        int[] f = frequency(sa);        Map<Integer, StringBuilder> inverse = new HashMap<>();        for(int i = 0; i < f.length; i++) {            if (f[i] > 0) {                StringBuilder sb = inverse.get(f[i]);                if (sb == null) {                    sb = new StringBuilder();                    inverse.put(f[i], sb);                }                sb.append((char)i);            }        }        char[] sorted = new char[sa.length];        for(int i = sa.length, pos = 0; i > 0; i--) {            StringBuilder sb = inverse.get(i);            if (sb == null) continue;            for(int j = 0; j < sb.length(); j++) {                char ch = sb.charAt(j);                for(int k = 0; k < i; k++) {                    sorted[pos++] = ch;                }            }        }        return new String(sorted);    }}


0 0
原创粉丝点击