微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

我如何用 reduce 或 fold 返回 IntArray?

如何解决我如何用 reduce 或 fold 返回 IntArray?

我的任务有以下数据:

Input: nums = [1,2,3,4]
Output: [1,6,10]
Explanation: Running sum is obtained as follows: [1,1+2,1+2+3,1+2+3+4].

如你所见,我需要返回 IntArray,我使用的第一件事是 runningReduce() ,但是这个函数Kotlin 1.4.30 的版本中使用。

fun runningSum(nums: IntArray): IntArray {
    return nums.runningReduce { sum,element -> sum + element }.toIntArray()
}

是的,此解决方案有效,但如何使用 reduce()fold() 解决相同的问题?

解决方法

尝试以下操作:

nums.fold(listOf(0)) { acc,i -> acc + (acc.last() + i) }.drop(1).toIntArray()

尽管该解决方案是次优的:它在每次迭代中复制列表。但看起来很花哨。

为了避免复制,你可以这样写:

nums.fold(mutableListOf(0)) { acc,i -> acc += (acc.last() + i); acc }.drop(1).toIntArray()

我想我更喜欢第一个版本,从功能的角度来看,第二个不是纯粹的。

,

Mafor 是对的,在生成集合时 fold() 不是一个好的选择,因为它每次都会复制集合,因此您需要解决可变集合,这违背了函数式风格。

如果您真的想使用可变的数组,那么使用老式的程序方法可能是最好的:

val array = intArrayOf(1,2,3,4)
for (i in array.indices.drop(1)) {
    array[i] += array[i - 1]
}
println(array.joinToString(","))

这是 Mafor 答案的略微修改版本,它为您提供 IntArray 并避免使用多个语句 - 但它仍然使用可变列表:

val input = intArrayOf(1,4)
val output = input.fold(mutableListOf(0)) { acc,cur ->
    acc.apply { add(last() + cur) }
}.drop(1).toIntArray()

println(output.joinToString(","))

这两个都打印 1,6,10

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。