题目说明
- 给定一个字符串,请将字符串里的字符按照出现的频率降序排列。
示例
示例 1:
1 2 3 4 5 6 7 8 9
| 输入: "tree"
输出: "eert"
解释: 'e'出现两次,'r'和't'都只出现一次。 因此'e'必须出现在'r'和't'之前。此外,"eetr"也是一个有效的答案。
|
示例 2:
1 2 3 4 5 6 7 8 9
| 输入: "cccaaa"
输出: "cccaaa"
解释: 'c'和'a'都出现三次。此外,"aaaccc"也是有效的答案。 注意"cacaca"是不正确的,因为相同的字母必须放在一起。
|
示例 3:
1 2 3 4 5 6 7 8 9
| 输入: "Aabb"
输出: "bbAa"
解释: 此外,"bbaA"也是一个有效的答案,但"Aabb"是不正确的。 注意'A'和'a'被认为是两种不同的字符。
|
笔者理解
此题是一道哈希算法问题,在力扣题库中被定义为中等题。
解法
当笔者阅读完此题后,发现此题套用哈希统计字符出现次数再排序即可,让我们来看看具体如何实现的吧。
实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
| class Solution {
public String frequencySort(String s) { StringBuilder sb = new StringBuilder();
HashMap<Character, Integer> map = new HashMap(); for (int i = 0; i < s.length(); i++) { if (!map.containsKey(s.charAt(i))) { map.put(s.charAt(i), 1); } else { map.put(s.charAt(i), map.get(s.charAt(i)) + 1); } }
List<Map.Entry<Character, Integer>> list = new ArrayList<Map.Entry<Character, Integer>>(map.entrySet());
Collections.sort(list, new Comparator<Map.Entry<Character, Integer>>() { @Override public int compare(Map.Entry<Character, Integer> o1, Map.Entry<Character, Integer> o2) { return o2.getValue().compareTo(o1.getValue()); } });
list.forEach((entry) -> { if (entry.getValue() != 0) { char[] temp = new char[entry.getValue()]; Arrays.fill(temp, entry.getKey()); sb.append(temp); } });
return sb.toString(); } }
|
时间效率一般,空间效率都还行,可见此解法还比较适合此题;

总结
本题是今天的每日一题,难度是为中等,感兴趣的朋友都可以去尝试一下,此题还有其他更多的解法,朋友们可以自己逐一尝试。