我想知道是否有更好的方法或惯用方法来计算Kotlin数组中的max int并且比O(nlogn)更快?
这段代码给出了O(n),但我觉得它太长了
fun countMax(n: Int, ar: Array<Int>): Int {
val max = ar.max();
var countMax = 0
for(i in ar)
if(i==max)
countMax++
return countMax
}
fun main(args: Array<String>) {
val scan = Scanner(System.`in`)
val n = scan.nextLine().trim().toInt()
val ar = scan.nextLine().split(" ").map{ it.trim().toInt() }.toTypedArray()
val result = birthdayCakeCandles(n, ar)
println(result)
}
排序然后计数得到nlogn
val input:Scanner = if(inputFile.exists())Scanner(inputFile)else Scanner(System。in
)
fun main(args: Array<String>) {
input.nextLine()
val nums = input.nextLine().split(' ').map { it.toLong() }.sorted()
val s = nums.takeLastWhile { it == nums.last() }.size
print(s)
}
我想知道代码更短,执行速度比O(nlogn)
更快答案 0 :(得分:4)
你可以这样做:
fun countMax(ar: Array<Int>) =
ar.max().let { max -> ar.count { it == max } }
使用max
计算最大值,然后使用count
获取数组中该最大值的出现次数。
或者,对值进行分组,以max为键提取组,并映射到大小:
fun countMax(ar: Array<Int>) =
ar.groupBy { it }.maxBy { it.key }?.value?.size
答案 1 :(得分:1)
Fold数组,其中初始值是一对保持Int.MIN_VALUE
并且计数为0
,并且如果给定元素相等,则操作返回一个新的对,递增计数到给定对的第一个数字(表示到目前为止看到的最大数字),或者如果元素大于第一个数字,则它返回一个保持该元素和计数1
的对,或者如果element小于第一个数字,然后它只返回同一对。
此方法仅遍历数组一次,最大限度地减少了执行的比较次数。