【发布时间】:2017-03-28 12:34:17
【问题描述】:
我正在尝试使用 Java 解决这个问题。目标是根据字符的频率以降序对字符串进行排序。例如,“Aabb”将是“bbaA”或“bbAa”。我已经实现了一个可行的解决方案,但它在 O(n^2) 中。我想知道是否有人有更好和更优化的解决方案。 代码如下:
public class Solution
{
public String frequencySort(String s)
{
Map<Character,Integer> map =new HashMap<Character,Integer>();
for(int i=0;i<s.length();i++)
{
if(map.containsKey(s.charAt(i)))
map.put(s.charAt(i),map.get(s.charAt(i))+1);
else
map.put(s.charAt(i),1);
}
List<Map.Entry<Character,Integer>> sortedlist = new ArrayList<>(map.entrySet());
Collections.sort(sortedlist, new Comparator<Map.Entry<Character,Integer>>() {
@Override
public int compare(Map.Entry<Character, Integer> o1,
Map.Entry<Character, Integer> o2) {
return o2.getValue() - o1.getValue();
}
});
String lastString="";
for (Map.Entry<Character,Integer> e : sortedlist)
{
for(Integer j=0;j < e.getValue();j++)
lastString+= e.getKey().toString();
}
return lastString;
}
}
【问题讨论】:
-
好吧,从技术上讲,这不是
O(n ^ 2)。这里可能有一些小的优化,但没有办法低于O(n log n),你已经在哪里了。 -
@Paul 所以在 Java 中没有办法更好地做到这一点吗? leetcode.com/problems/sort-characters-by-frequency 由于时间限制不接受这个答案
-
当然有办法改进代码。将
Map<Character,Integer>替换为Map<Character,int[]>,这样您就可以使用++更新整数值,而不是对Integer对象进行拆箱和重新装箱。如果运行 Java 8,请使用merge()方法。不要使用string += string,而是使用StringBuilder。出于与上述相同的原因,将循环更改为int,而不是Integer。要创建 N 次相同字母的字符串,请创建char[N]并使用Arrays.fill()将字母分配给所有元素。 -
你考虑过树形图吗?它会为你自动排序,虽然我不完全确定它是否更快
-
@HiradRoshandel 好吧,没有更好的时间复杂度算法(假设您的哈希图在
O(1)中工作。这并不意味着您的代码无法优化。这意味着您不会能够提高渐近时间复杂度,但有很多方法可以改进此代码。
标签: java algorithm sorting hashmap