我能够使用Swift 3 Playgrounds找到阵列的平衡点。现在,我正在尝试创建一个循环数组并应用我的代码的方法(func)。这是Swift 3 Playgrounds的代码:
import Foundation
let myArray = [1, 2, 5, 8, 4, 4]
let divSum = myArray.reduce(0, {$0 + $1}) / 2
print (divSum)
var myBalancePoint = Int()
if myArray[0] + myArray[1] >= divSum {
myBalancePoint = myArray[1]
} else {
if myArray[0] + myArray[1] + myArray[2] >= divSum {
myBalancePoint = myArray[2]
} else {
if myArray[0] + myArray[1] + myArray[2] + myArray[3] >= divSum {
myBalancePoint = myArray[3]
} else {
if myArray[0] + myArray[1] + myArray[2] + myArray[3] + myArray[4] >= divSum {
myBalancePoint = myArray[4]
} else {
if myArray[0] + myArray[1] + myArray[2] + myArray[3] + myArray[4] + myArray[5] >= divSum {
myBalancePoint = myArray[5]
}
}
}
}
}
print (myBalancePoint)
答案 0 :(得分:1)
这是一个可能的实现:
func balancePoint(of a: [Int]) -> Int? {
var leftSum = 0
var rightSum = a.reduce(0, +)
for (idx, elem) in a.enumerated() {
rightSum -= elem
if leftSum == rightSum {
return idx
}
leftSum += elem
}
return nil
}
示例:
let myArray = [1, 2, 5, 8, 4, 4]
if let bp = balancePoint(of: myArray) {
print("Balance point index:", bp, "Value:", myArray[bp])
} else {
print("No balance point")
}
输出:
Balance point index: 3 Value: 8
它是如何工作的?
var leftSum = 0
var rightSum = a.reduce(0, +)
分别是当前元素左侧和右侧的所有元素的当前总和。
for (idx, elem) in a.enumerated() {
遍历数组,将idx
设置为当前索引
和elem
到当前数组元素。
rightSum -= elem
if leftSum == rightSum {
return idx
}
leftSum += elem
首先从正确的总和中减去当前元素。 如果左右总和相等,那么我们找到了平衡点。 否则,更新下一次迭代的左总和并继续。
}
return nil
未找到平衡点:返回nil
。