我如何 return IntArray 减少或折叠?
How I can return IntArray with reduce or fold?
我的任务有以下数据:
Input: nums = [1,2,3,4]
Output: [1,3,6,10]
Explanation: Running sum is obtained as follows: [1, 1+2, 1+2+3, 1+2+3+4].
如你所见,我需要return 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, 2, 3, 4)
val output = input.fold(mutableListOf(0)) { acc, cur ->
acc.apply { add(last() + cur) }
}.drop(1).toIntArray()
println(output.joinToString(", "))
这两个打印 1, 3, 6, 10
.
我的任务有以下数据:
Input: nums = [1,2,3,4]
Output: [1,3,6,10]
Explanation: Running sum is obtained as follows: [1, 1+2, 1+2+3, 1+2+3+4].
如你所见,我需要return 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, 2, 3, 4)
val output = input.fold(mutableListOf(0)) { acc, cur ->
acc.apply { add(last() + cur) }
}.drop(1).toIntArray()
println(output.joinToString(", "))
这两个打印 1, 3, 6, 10
.