这是一个从给定数组生成映射的函数。其中key是整数,值是给定数组中该数字的频率。 我需要找到频率最高的钥匙。如果两个键具有相同的频率,那么我需要取较小的键。
这就是我写的:
def findMinKeyWithMaxFrequency(arr: List[Int]): Int = {
val ansMap:scala.collection.mutable.Map[Int,Int] = scala.collection.mutable.Map()
arr.map(elem=> ansMap+=(elem->arr.count(p=>elem==p)))
ansMap.filter(_._2==ansMap.values.max).keys.min
}
val arr = List(1, 2 ,3, 4, 5, 4, 3, 2, 1, 3, 4)
val ans=findMinKeyWithMaxFrequency(arr) // output:3
如何提高效率,这给了我正确的答案,但我认为这不是解决问题的最有效方法。
在给定的示例中,频率3和4为3,因此答案应为3,因为3小于4。
编辑1:
这就是我所做的,以使其效率更高。它将arr转换为Set,因为我们只需要查找唯一元素的频率即可。
def findMinKeyWithMaxFrequency(arr: List[Int]): Int = {
val ansMap=arr.toSet.map{ e: Int =>(e,arr.count(x=>x==e))}.toMap
ansMap.filter(_._2==ansMap.values.max).keys.min
}
效率更高吗?这是针对给定问题编写解决方案的最实用的方法。
答案 0 :(得分:3)
def findMinKeyWithMaxFrequency(arr: List[Int]): Int =
arr.groupBy(identity).toSeq.maxBy(p => (p._2.length,-p._1))._1
使用groupBy()
获得每个元素的有效计数,然后在展平为一系列元组之后,对所需的规则进行编码以确定最大值。