451.根据字符出现频率排序(中等)
- 1. 题目描述
- 2.详细题解
- 3.代码实现
- 3.1 Python
- 3.2 Java
1. 题目描述
题目中转:451.根据字符出现频率排序(中等)
2.详细题解
题目: 347. 前 K 个高频元素(中等)的变型,使用桶排序算法,区别在于本题是按照频率高低降序输出。
对于本题,先统计各元素出现的频率,再以元素的频率作为桶,将相应频率的元素放入指定桶中。具体算法如下:
- Step1:初始化:统计各元素出现的频率,数据结构为字典,算法时间复杂度为 O ( n ) O(n) O(n);
- Step2:数组中元素个数为 n n n,构建 n + 1 n+1 n+1个桶,数据结构为数组,数组的索引下标对应元素出现的频率(可进一步优化,桶的数据为元素出现的最大频率);
- Step3:遍历各元素出现的频率,放入对应桶中,算法时间复杂度为 O ( m ) O(m) O(m);
- Step4:从右至左遍历桶,如果桶中有元素,则放入最终结果,重复次数为出现的频率数;
- Step5:遍历结束,程序结束,返回结果。
3.代码实现
3.1 Python
class Solution:
def frequencySort(self, s: str) -> str:
fre_dict = {}
for c in s:
fre_dict[c] = fre_dict.get(c, 0) + 1
res = [None for _ in range(len(s)+1)]
for k, v in fre_dict.items():
if res[v] is None:
res[v] = []
res[v].append(k)
ans = ""
for i in range(len(res)-1, -1, -1):
if res[i] is None:
continue
for c in res[i]:
ans += c * fre_dict[c]
return ans
3.2 Java
class Solution {
public String frequencySort(String s) {
StringBuilder ans = new StringBuilder();
HashMap<Character, Integer> fre_dict = new HashMap();
for (char c: s.toCharArray()){
if (fre_dict.containsKey(c)){
fre_dict.put(c, fre_dict.get(c) + 1);
}else{
fre_dict.put(c, 1);
}
}
List<Character>[] list = new List[s.length()+1];
for (char key: fre_dict.keySet()){
int index = fre_dict.get(key);
if (list[index] == null){
list[index] = new ArrayList();
}
list[index].add(key);
}
for (int i=list.length-1; i>=0; i--){
if (list[i] == null) continue;
for (char c: list[i]){
for (int j=0; j<fre_dict.get(c); j++){
ans.append(c);
}
}
}
return ans.toString();
}
}
执行用时不必过于纠结,对比可以发现,对于python和java完全相同的编写,java的时间一般是优于python的;至于编写的代码的执行用时击败多少对手,执行用时和网络环境、当前提交代码人数等均有关系,可以尝试完全相同的代码多次执行用时也不是完全相同,只要确保自己代码的算法时间复杂度满足相应要求即可,也可以通过点击分布图查看其它coder的code。