我有一组无符号整数,我想获得某些子集的乘积。
例如,如果我的数组是[2,2,1,5],我想要每两个数字的乘积(2 * 2 = 4和1 * 5 = 5)。
到目前为止,我已经:
var myArray:[UInt8] = [2,2,1,5]
var mySlice: Array<UInt8>
for (index,i) in enumerate(myArray) {
if (index % 2 == 1) {
mySlice = Array(myArray[(index - 1)...index])
println(mySlice.reduce(1,*))
mySlice.removeAll()
}
}
这看起来好像会起作用(虽然很难看)但是我觉得执行被打断了,原因是:EXC_BAD_INSTRUCTION。
以一定间隔线性向下返回返回产品(或计算)的数组的最佳方法是什么?
感谢。
答案 0 :(得分:1)
看起来问题是在迭代更大的数组时清除切片。
您可以通过将项目添加到单独的数组中来解决此问题,如下所示:
let myArray:[UInt8] = [2,2,1,5]
var result:[UInt8] = []
for (index,i) in enumerate(myArray) {
if (index % 2 == 1) {
let mySlice = Array(myArray[(index - 1)...index])
let tmp = mySlice.reduce(1,*)
result.append(tmp)
println(tmp)
}
}
println(result)
如果您想将结果放回myArray
,可以在循环后分配。
答案 1 :(得分:0)
您可以进行一些更改,这将使您比当前尝试更容易(并且具有更好的性能)。首先,使用全局stride(from:to:interval:)
函数,它构建一个索引序列,就像你想要的那样 - 不需要遍历所有索引并跳过奇怪的索引!
for i in stride(from: 0, to: myArray.count, by: 2) {
// ...
}
其次,您可以使用切片的reduce
方法,因此您不必将切片转换回数组(这样做是unnecessary and inefficient):
let r = myArray[i ... i + 1].reduce(1, *)
所以要把它们放在一起,你的代码可能是:
var myArray: [UInt8] = [2, 2, 1, 5]
var result: [UInt8] = []
for i in stride(from: 0, to: myArray.count, by: 2) {
result.append( myArray[i...i + 1].reduce(1, *) )
}
// result is [4, 5]