如何解决我如何用 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 举报,一经查实,本站将立刻删除。