您将获得一个整数数组,并根据
的频率对这些整数进行排序
它们的发生。设计算法并分析其时间复杂度。如果是领带,则较小的
数字应首先出现在排序列表中。
样本输入:3,4,3,2,3,5,4,2,2,1,2
样品输出:1 5 4 3 2
答案 0 :(得分:3)
如果允许额外空间:检查输入并进行频率分析。把它写在一些哈希表中。这意味着,粗略地说:
for each x in input:
if x in table:
++table[x]
else
table.insert(x)
然后,对唯一值进行简单的Quicksort,比较函数考虑频率而不是值本身。
那是:
function freq_compare (x, y):
return compare(table[x], table[y])
其中compare
是频率的数字。
答案 1 :(得分:1)
对数组进行排序,然后我们可以轻松获得数字的频率,因为重复的数字将彼此相邻放置。当您获得数字的频率时,将其插入地图中,其中键作为频率,值作为数字。由于map以排序顺序存储键,因此我们可以迭代映射以获得结果。
答案 2 :(得分:0)
首先制作HashMap,将数组元素作为键,将频率作为值。 使用Comparator根据键和值对它们进行排序。
import java.io.*;
import java.util.*;
import java.lang.*;
public class Sum_of
{
public static HashMap<Integer, Integer> sortHashMapByValues(
HashMap<Integer, Integer> passedMap) {
List<Integer> mapKeys = new ArrayList<>(passedMap.keySet());
List<Integer> mapValues = new ArrayList<>(passedMap.values());
Collections.sort(mapValues);
Collections.sort(mapKeys);
LinkedHashMap<Integer, Integer> sortedMap =
new LinkedHashMap<>();
Iterator<Integer> valueIt = mapValues.iterator();
while (valueIt.hasNext()) {
Integer val = valueIt.next();
Iterator<Integer> keyIt = mapKeys.iterator();
while (keyIt.hasNext()) {
Integer key = keyIt.next();
Integer comp1 = passedMap.get(key);
Integer comp2 = val;
if (comp1.equals(comp2)) {
keyIt.remove();
sortedMap.put(key, val);
break;
}
}
}
return sortedMap;
}
public static void main(String args[])
{
HashMap<Integer,Integer> hs = new HashMap<Integer,Integer>();
int a[]={3,4,3,2,3,5,4,2,2,1,2};
int n= a.length;
int c=0;
for(int i=0;i<n;i++)
{
if(hs.containsKey(a[i]))
{
c=hs.get(a[i]);
hs.put(a[i],c+1);
}
else
hs.put(a[i],1);
}
hs=Sum_of.sortHashMapByValues(hs);
System.out.println(hs.keySet());
}
}