scala - 我怎样才能使以下功能更有效?
问题描述
这是一个从给定数组制作地图的函数。其中key是整数,value是给定数组中这个数字的频率。我需要找到具有最大频率的密钥。如果两个键具有相同的频率,那么我需要选择较小的键。
这就是我写的:
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
}
能不能更有效率?它是为给定问题编写解决方案的最实用的方法吗?
解决方案
def findMinKeyWithMaxFrequency(arr: List[Int]): Int =
arr.groupBy(identity).toSeq.maxBy(p => (p._2.length,-p._1))._1
用于groupBy()
获取每个元素的有效计数,然后在展平为元组序列后,对所需规则进行编码以确定最大值。
推荐阅读
- zos - 是否可以将 JCL SYSOUT 的内容转储到 z/OS 平面文件?
- javascript - 如何使用 amcharts 4 在地图中的多个饼图中创建共享图例?
- sql-server - 数据库“master”中的 CREATE DATABASE 权限被拒绝(无管理员权限)
- mongodb - 将项目推送到数组,仅包含第一个属性。猫鼬
- laravel - 使用 laravel 刀片输入 id = ex。id="group-{{$category->id}}" 如何命名 old('xxxxx')
- angularjs - AngularJS ng-class 同一个类有不同的条件
- javascript - Ionic 3 错误:当命令运行 ionic cordova run android
- wordpress - Woocommerce 订阅和同步强制销售不起作用?
- flutter - 无法从 Flutter 插件顶部加载资产
- mysql - SQL:哪个国家的城市最多?